
I used BOOST_FOREACH with a collection whose iterator is derived from boost::iterator_adaptor. I got this: 7>E:\boost_1_47\boost/range/iterator.hpp(63): error C2039: 'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>' 7> with 7> [ 7> C=true, 7> F1=boost::range_const_iterator<VSeeClient_list>, 7> F2=boost::range_mutable_iterator<const type> 7> ] 7> E:\boost_1_47\boost/foreach.hpp(670) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled 7> with 7> [ 7> C=const type 7> ] 7> AutoPerformance\APSystem.cpp(224) : see reference to function template instantiation 'boost::foreach_detail_::auto_any<T> boost::foreach_detail_::begin<VSeeClient_list,boost::mpl::false_>(boost::foreach_detail_::auto_any_t,boost::foreach_detail_::type2type<VSeeClient_list,C> *,boost::mpl::false_ *)' being compiled 7> with 7> [ 7> T=VSeeClient_list::iterator, 7> C=boost::mpl::false_ 7> ] The error points here: template< typename C > struct range_iterator { typedef BOOST_RANGE_DEDUCED_TYPENAME mpl::eval_if_c< is_const<C>::value, range_const_iterator< typename remove_const<C>::type >, range_mutable_iterator<C> >::type type; }; Now a little looking through the manual tells me that mpl::eval_if_c::type will be one of the two metafunctions, so it should not disappear completely. I don't believe I missed anything from the iterator code: the Value type is given as the 3rd template argument to the iterator_adaptor, so that should set up any metafunctions needed to find the iterator's type, right? I'm compiling using MS Visual Studio 10. —John