> > Hi, > > Hi Jaap, Wow, fast reply. Thanks!
> including MSVC 6.5/7.0 (assuming the latest CVS sources). Or are you using > the 1.29.0 archive? I have the latest CVS sources (I did a full 'get' over the 1_29_0 release in case you wonder where the boost_1_29_0 directory comes from in the path below). > > but that didn't fix it. > > Hmm, works for me, even if I remove the 'plus' inheritance: You are right, I apologize. I never actually tried the example in the original post, I just assumed that it was the same as the actual code. However, after your reply I tried it, and it does in fact compile. So I tried to come up with the actual smallest example that doesn't compile, even with the LAMBDA_SUPPORT macro. It looks as follows: template< class T > struct meta_fun_1 { typedef mpl::integral_c< typename T::value_type, 0 > type; BOOST_MPL_AUX_LAMBDA_SUPPORT( 1, meta_fun_1, (T) ) }; template< class List, class T > struct meta_fun_2 { typedef typename mpl::fold< List, mpl::integral_c< size_t, 0 >, meta_fun_1< mpl::_1 > >::type type; }; The problem lies in the fact that I try to use a dependent type in meta_fun_1. I have pasted the full compiler error at the bottom of the message (it's rather long). The first few lines say: 'value_type' : is not a member of 'boost::mpl::arg<N>' with [ N=1 ] <snip> e:\library\boost_1_29_0\boost\type_traits\is_convertible.hpp(61) : see reference to class template instantiation 'test::meta_fun_1<T>' being compiled with [ T=boost::mpl::_1 ] Any suggestions? I can work-around it by using plain integers instead of ::value_type, but it's not as elegant. > > what compiler-problems they try to fix, and how they do it? > > They are compensating the lack of partial template specialization or/and > template template parameters support by the means of introducing an > intrusive metafunction's introspection mechanism. The implementation details > are gloriously nasty, vary from compiler to compiler, and generally aren't > worth one's time. :) haha. I can't even begin to imagine the pain you must have gone through to get this working. I'm porting something from Intel to other compilers. It took me a while to get GCC up and running. I kept gettting segmentation faults (internal compiler errors). It turned out that if I changed this: template < ... > struct meta_fun { template < ... > struct helper_fun_only_used_here {}; typedef helper_fun_only_used_here< ... >::type type; }; to template < ... > struct helper_fun_only_used_here {}; template < ... > struct meta_fun { typedef helper_fun_only_used_here< ... >::type type; }; Everything compiled fine. Thus, instead of using an inner-class (because it is an implementation detail), I just moved it into the enclosing namespace. How is one suppose to discover that? It was just a guess from my part. Oh well :). I will add an item to the wiki that moving around meta-functions in through a scope-hierarchy might some fix certain problems on certain compilers :). In case you need it, here is the complete error that MSVC 7 produces with the above code. In it, scalar_grade is an mpl::vector_c<> and space is a traits class but not really important in this case because it's not used. ____________________________________________ 'value_type' : is not a member of 'boost::mpl::arg<N>' with [ N=1 ] e:\library\boost_1_29_0\boost\mpl\aux_\preprocessed\msvc70\arg.hpp(28) : see declaration of 'boost::mpl::arg<N>' with [ N=1 ] e:\library\boost_1_29_0\boost\type_traits\is_convertible.hpp(61) : see reference to class template instantiation 'test::meta_fun_1<T>' being compiled with [ T=boost::mpl::_1 ] e:\library\boost_1_29_0\boost\type_traits\is_convertible.hpp(77) : see reference to class template instantiation 'boost::detail::does_conversion_exist<From>::result_<To>' being compiled with [ From=boost::detail::is_enum_impl<test::meta_fun_1<boost::mpl::_1>>::r_type , To=boost::detail::int_convertible ] e:\library\boost_1_29_0\boost\type_traits\is_convertible.hpp(178) : see reference to class template instantiation 'boost::detail::is_convertible_impl<From,To>' being compiled with [ From=boost::detail::is_enum_impl<test::meta_fun_1<boost::mpl::_1>>::r_type , To=boost::detail::int_convertible ] e:\library\boost_1_29_0\boost\type_traits\is_enum.hpp(54) : see reference to class template instantiation 'boost::is_convertible<From,To>' being compiled with [ From=boost::detail::is_enum_impl<test::meta_fun_1<boost::mpl::_1>>::r_type , To=boost::detail::int_convertible ] e:\library\boost_1_29_0\boost\type_traits\is_enum.hpp(91) : see reference to class template instantiation 'boost::detail::is_enum_helper<is_typename_arithmetic_or_reference>::type<T> ' being compiled with [ is_typename_arithmetic_or_reference=false, T=boost::detail::is_enum_impl<test::meta_fun_1<boost::mpl::_1>>::r_type ] e:\library\boost_1_29_0\boost\type_traits\is_enum.hpp(96) : see reference to class template instantiation 'boost::detail::is_enum_impl<T>' being compiled with [ T=test::meta_fun_1<boost::mpl::_1> ] e:\library\boost_1_29_0\boost\type_traits\is_scalar.hpp(30) : see reference to class template instantiation 'boost::is_enum<T>' being compiled with [ T=test::meta_fun_1<boost::mpl::_1> ] e:\library\boost_1_29_0\boost\type_traits\is_scalar.hpp(50) : see reference to class template instantiation 'boost::detail::is_scalar_impl<T>' being compiled with [ T=test::meta_fun_1<boost::mpl::_1> ] e:\library\boost_1_29_0\boost\type_traits\is_class.hpp(78) : see reference to class template instantiation 'boost::is_scalar<T>' being compiled with [ T=test::meta_fun_1<boost::mpl::_1> ] e:\library\boost_1_29_0\boost\type_traits\is_class.hpp(93) : see reference to class template instantiation 'boost::detail::is_class_impl<T>' being compiled with [ T=test::meta_fun_1<boost::mpl::_1> ] e:\library\boost_1_29_0\boost\mpl\aux_\has_rebind.hpp(32) : see reference to class template instantiation 'boost::is_class<T>' being compiled with [ T=test::meta_fun_1<boost::mpl::_1> ] e:\library\boost_1_29_0\boost\mpl\aux_\template_arity.hpp(51) : see reference to class template instantiation 'boost::mpl::aux::has_rebind<T>' being compiled with [ T=test::meta_fun_1<boost::mpl::_1> ] e:\library\boost_1_29_0\boost\mpl\aux_\preprocessed\msvc70\lambda_no_ctps.hp p(150) : see reference to class template instantiation 'boost::mpl::aux::template_arity<F>' being compiled with [ F=test::meta_fun_1<boost::mpl::_1> ] e:\library\boost_1_29_0\boost\mpl\fold.hpp(42) : see reference to class template instantiation 'boost::mpl::lambda<T,Protect>' being compiled with [ T=test::meta_fun_1<boost::mpl::_1>, Protect=true ] e:\projects\test\test_2d_euclidian.cpp(36) : see reference to class template instantiation 'boost::mpl::fold<Sequence,State,ForwardOp>' being compiled with [ Sequence=scalar_grade, State=boost::mpl::integral_c<size_t,0>, ForwardOp=test::meta_fun_1<boost::mpl::_1> ] e:\projects\test\test_2d_euclidian.cpp(59) : see reference to class template instantiation 'test::meta_fun_2<List,T>' being compiled with [ List=scalar_grade, T=space ] e:\projects\test_2d_euclidian.cpp(25) : fatal error C1507: previous user errors and subsequent error recovery halt further compilation _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost