Boost logo

Boost :

Subject: Re: [boost] [mpl] Using apply with gcc error
From: Edward Diener (eldiener_at_[hidden])
Date: 2011-02-03 18:30:53


On 2/3/2011 6:08 PM, Larry Evans wrote:
> On 02/03/11 17:02, Steven Watanabe wrote:
>> AMDG
>>
>> On 2/3/2011 2:42 PM, Edward Diener wrote:
>>> Compiling this code with gcc:
>>>
>>> #include<boost/config.hpp>
>>> #include<boost/mpl/apply.hpp>
>>>
>>> template
>>> <
>>> class MF,
>>> class T
>>> >
>>> struct myMF :
>>> boost::mpl::apply<MF,T>
>>> {
>>> BOOST_STATIC_CONSTANT(bool,value=type::value);
>>> };
>>>
>>> int main()
>>> {
>>> return 0;
>>> }
>>>
>>> Gives:
>>>
>>> "gcc.compile.c++
>>> ..\..\..\bin.v2\libs\tti\test\TestMFHasTypeMFC.test\gcc-mingw-4.5.2\debug\TestMFHasTypeMFC.o
>>>
>>>
>>> TestMFHasTypeMFC.cpp:18:5: error: 'type' has not been declared
>>>
>>
>> gcc is correct. Members of a dependent base class are
>> not visible in the derived class. (This is necessary
>> to allow the template to be parsed before the template
>> arguments are known.).
>>
>> Add
>> using typename boost::mpl::apply<MF,T>::type;
>>
>> In Christ,
>> Steven Watanabe
>> _______________________________________________
> That using works with clang++; however, my gcc (gcc4.5.1)
> still doesn't like it:
>
> make using
> cat myMF.cpp
> //Copied from post with headers:
> /*
> From: Edward Diener<eldiener_at_[hidden]>
> Newsgroups: gmane.comp.lib.boost.devel
> Subject: [mpl] Using apply with gcc error
> Date: Thu, 03 Feb 2011 17:42:44 -0500
> Lines: 47
> */
> #include<boost/config.hpp>
> #include<boost/mpl/apply.hpp>
>
> template
> <
> class MF,
> class T
> >
> struct myMF :
> boost::mpl::apply<MF,T>
> {
> using typename boost::mpl::apply<MF,T>::type;
> BOOST_STATIC_CONSTANT(bool,value=type::value);
> };
>
> int main()
> {
> return 0;
> }
> /home/evansl/download/llvm/svn/build/Debug+Asserts/bin/clang++ -c
> -std=c++0x -U__GXX_EXPERIMENTAL_CXX0X__ -c myMF.cpp
> /home/evansl/download/gcc/4.5.1-release/install/bin/g++ -c -Wall
> -ftemplate-depth-300 -O0 -std=gnu++0x -c myMF.cpp
> myMF.cpp:21:6: error: 'type' is not a class, namespace, or enumeration
> make: [using] Error 1 (ignored)
>
> Compilation finished at Thu Feb 3 17:04:44

I guess the easiest solution is to just give up the metafunction
forwarding and have:

   template
     <
     class MF,
     class T
>
   struct myMF
     {
     typedef typename boost::mpl::apply<MF,T>::type type;
     BOOST_STATIC_CONSTANT(bool,value=type::value);
     };

This seems to work everywhere.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk