MPL: set<> not fully supporting compile time iteration?

struct A {}; struct B {}; struct C {}; struct D {}; struct print_type { template <typename T> void operator()(T const& v) const { std::cout << "[ " << typeid(v).name() << " ] "; } }; void func() { typedef mpl::set3<A,B,C> myset; typedef mpl::vector<> vec; typedef myset::type t; // copy it to a vector typedef mpl::copy < myset::type , back_inserter< vec > >::type result_vec; mpl::for_each<result_vec>( print_type()); } ***** gives me the following errors (pointing at the mpl::copy<> line) MSVC7.1 BOOST 1.32 ***** \boost\mpl\deref.hpp(30) : error C2039: 'type' : is not a member of 'boost::mpl::s_iter<Set,Tail>' with [ Set=boost::mpl::set3<A,B,C>::type, Tail=boost::mpl::set0<> ] \boost\mpl\aux_\preprocessed\plain\fold_impl.hpp(89) : see reference to class template instantiation 'boost::mpl::deref<Iterator>' being compiled with [ Iterator=boost::mpl::aux::fold_impl<3,boost::mpl::begin<boost::mpl::set3 <A,B,C>::type>::type,boost::mpl::end<boost::mpl::set3<A,B,C>::type>::typ e,boost::mpl::inserter<boost::mpl::vector<boost::mpl::na,boost::mpl::na, boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl:: na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mp l::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost: :mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::mpl::push_ back<boost::mpl::na,boost::mpl::na>>::state,boost::mpl::inserter<boost:: mpl::vector<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na, boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl:: na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mp l::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost: :mpl::na,boost::mpl::na>,boost::mpl::push_back<boost::mpl::na,boost::mpl ::na>>::operation>::iter1 ] \boost\mpl\fold.hpp(39) : see reference to class template instantiation 'boost::mpl::aux::fold_impl<N,First,Last,State,ForwardOp>' being compiled with [ N=3, First=boost::mpl::begin<boost::mpl::set3<A,B,C>::type>::type, Last=boost::mpl::end<boost::mpl::set3<A,B,C>::type>::type, State=boost::mpl::inserter<boost::mpl::vector<boost::mpl::na,boost::mpl: :na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::m pl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost ::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,bo ost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::mpl::p ush_back<boost::mpl::na,boost::mpl::na>>::state, ForwardOp=boo st::mpl::inserter<boost::mpl::vector<boost::mpl::na,boost::mpl::na,boost ::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,bo ost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na ,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl: :na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::mpl::push_back< boost::mpl::na,boost::mpl::na>>::operation ] \boost\mpl\copy.hpp(36) : see reference to class template instantiation 'boost::mpl::fold<Sequence,State,ForwardOp>' being compiled with [ Sequence=boost::mpl::set3<A,B,C>::type, State=boost::mpl::inserter<boost::mpl::vector<boost::mpl::na,boost::mpl: :na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::m pl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost ::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,bo ost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::mpl::p ush_back<boost::mpl::na,boost::mpl::na>>::state, ForwardOp=boost::mpl::inserter<boost::mpl::vector<boost::mpl::na,boost:: mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boos t::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,b oost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::n a,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::mp l::push_back<boost::mpl::na,boost::mpl::na>>::operation ] \boost\mpl\copy.hpp(54) : see reference to class template instantiation 'boost::mpl::aux::copy_impl<Sequence,Inserter>' being compiled with [ Sequence=boost::mpl::set3<A,B,C>::type, Inserter=boost::mpl::back_inserter<boost::mpl::vector<boost::mpl::na,boo st::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na, boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl:: na,boost::mpl ::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost:: mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>> ] \MplUnique\Test_MplUnique.cpp(158) : see reference to class template instantiation 'boost::mpl::copy<P1,P2>' being compiled with [ P1=boost::mpl::set3<A,B,C>::type, P2=boost::mpl::back_inserter<boost::mpl::vector<boost::mpl::na,boost::mp l::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost: :mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boo st::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na, boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>> ] \boost\mpl\deref.hpp(30) : error C2955: 'boost::type' : use of class template requires template argument list \boost\type.hpp(14) : see declaration of 'boost::type' \boost\mpl\aux_\preprocessed\plain\fold_impl.hpp(89) : error C3203: 'type' : class template invalid as template argument for template parameter 'T2', expected a real type \boost\mpl\aux_\preprocessed\plain\fold_impl.hpp(91) : error C3203: 'type' : class template invalid as template argument for template parameter 'T2', expected a real type Build log was saved at "file://\MplUnique\_Prj\MsVc_V71\Test Debug\BuildLog.htm" Test_MplUnique - 4 error(s), 0 warning(s)

Brian Braatz <brianb <at> rmtg.com> writes:
[snip] // copy it to a vector typedef mpl::copy < myset::type , back_inserter< vec >
>::type result_vec;
mpl::for_each<result_vec>( print_type()); } ...
Try: typedef mpl::copy < mpl::begin<myset> , mpl::back_inserter<vec>
::type result_vec;
HTH -Ryan

Ryan <ryan.gallagher@gmail.com> writes:
Brian Braatz <brianb <at> rmtg.com> writes:
[snip] // copy it to a vector typedef mpl::copy < myset::type , back_inserter< vec >
>::type result_vec;
mpl::for_each<result_vec>( print_type()); } ...
Try:
typedef mpl::copy < mpl::begin<myset> , mpl::back_inserter<vec>
::type result_vec;
Err, no. The manual says: template< typename Sequence , typename In = unspecified > struct copy { typedef unspecified type; }; There was nothing wrong with what Brian wrote, although he could have dropped ::type from myset::type. I'm looking into the causes of his trouble right now. -- Dave Abrahams Boost Consulting www.boost-consulting.com
participants (3)
-
Brian Braatz
-
David Abrahams
-
Ryan