Jaap Suter wrote:
> 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. 

Yep, to be concrete, 'T::value_type'. Please see the following posts for an
explanation of the shortcoming, as well as for a technique to work around
it:

http://lists.boost.org/MailArchives/boost/msg39915.php (the relevant part
starts from "Well, having said that..." paragraph)
http://lists.boost.org/MailArchives/boost/msg39930.php (further explanation)


> 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.

    template< class T >
    struct meta_fun_1_impl
    {
        typedef mpl::integral_c< typename T::value_type, 0 > type;
    };

    template< class T >
    struct meta_fun_1
        : mpl::if_<
              mpl::is_placeholder<T>
            , mpl::identity<T>
            , meta_fun_1_impl<T>
            >::type
    {
        BOOST_MPL_AUX_LAMBDA_SUPPORT( 1, meta_fun_1, (T) )
    };

Or, if it's an internal/helper metafunction, just re-write it as a
metafunction class and, if you need to bind parameters to it - well, just
use 'bind':

    typedef fold< types, int_c<0>, bind<tenary_meta_fun_class, _1 ,_2, int>
>::type res;

A.
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to