+ Problems with MSVC++ 7.0 (as ever) and dereference (I guess this is a problem with default types). Demonstrated with reverse_iterator:
int numbers[] = { 1,2,3,4,5,6,7 }; const int N = sizeof(numbers)/sizeof(int); std::vector<int> v( numbers, numbers + N );
typedef boost::reverse_iterator< std::vector<int>::iterator > reverse_iterator; reverse_iterator rit( v.begin() );
if( *rit == v[0] ) // Does not compile { }
if( v[0] == *rit ) // Does not compile { }
What is the error message you get? ** Did you read it? **
The problem is most likely that vc7 has no partial specialization and
thus can't deduce the value_type of an int*.
Very well, here is it: (and of course I read it):
==========
\boost-sandbox\libs\view\test\dereference_equality_test.cpp(15) : error C2676: binary '==' : 'boost::iterator_facade<Derived,Value,AccessCategory,TraversalCategory,Reference,Difference>::reference' does not define this operator or a conversion to a type acceptable to the predefined operator
with
[
Derived=boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,
Value=boost::mpl::apply_if<boost::is_same<boost::use_default,boost::use_default>,boost::iterator_value<_STL::vector<int,_STL::allocator<int>>::iterator >,boost::mpl::identity<boost::use_default>>::type,
AccessCategory=boost::mpl::apply_if<boost::detail::is_new_iterator_tag<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category>,boost::detail::new_category_to_access<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category,boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::reference>,boost::detail::iter_category_to_access<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category,boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::reference>>::type,
TraversalCategory=boost::mpl::apply_if<boost::detail::is_new_iterator_tag<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category>,boost::detail::get_traversal_category<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category>,boost::detail::iter_category_to_traversal<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category>>::type,
Reference=boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::reference,
Difference=boost::mpl::apply_if<boost::is_same<boost::use_default,boost::use_default>,boost::iterator_difference<_STL::vector<int,_STL::allocator<int>>::iterator >,boost::mpl::identity<boost::use_default>>::type
]
\boost-sandbox\libs\view\test\dereference_equality_test.cpp(18) : error C2677: binary '==' : no global operator found which takes type 'boost::iterator_facade<Derived,Value,AccessCategory,TraversalCategory,Reference,Difference>::reference' (or there is no acceptable conversion)
with
[
Derived=boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,
Value=boost::mpl::apply_if<boost::is_same<boost::use_default,boost::use_default>,boost::iterator_value<_STL::vector<int,_STL::allocator<int>>::iterator >,boost::mpl::identity<boost::use_default>>::type,
AccessCategory=boost::mpl::apply_if<boost::detail::is_new_iterator_tag<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category>,boost::detail::new_category_to_access<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category,boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::reference>,boost::detail::iter_category_to_access<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category,boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::reference>>::type,
TraversalCa
tegory=boost::mpl::apply_if<boost::detail::is_new_iterator_tag<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category>,boost::detail::get_traversal_category<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category>,boost::detail::iter_category_to_traversal<boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::category>>::type,
Reference=boost::detail::iterator_adaptor_base<boost::reverse_iterator<_STL::vector<int,_STL::allocator<int>>::iterator>,_STL::vector<int,_STL::allocator<int>>::iterator ,boost::use_default,boost::use_default,boost::use_default,boost::use_default>::reference,
Difference=boost::mpl::apply_if<boost::is_same<boost::use_default,boost::use_default>,boost::iterator_difference<_STL::vector<int,_STL::allocator<int>>::iterator >,boost::mpl::identity<boost::use_default>>::type
]
If you manually specialize boost::detail::iterator_traits it should work.
The problem is the reference type. Yes, it works if you manually pass all (or some) of the types; then again, this would require to include thse types into the definition of reverse_iterator etc.
- Roland
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost