$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] Strange iterator_traits of iterator_facade
From: Swerts, Benjamin (Benjamin.Swerts_at_[hidden])
Date: 2010-02-26 04:46:56
> AMDG
> 
> Swerts, Benjamin wrote:
> > I have a class that is templated on an iterator type. As it 
> only works 
> > with bidirectional and random access iterators, I thought I would 
> > impose that as follows:
> >
> > template<typename T> class A
> > {
> >   A() { 
> checkIterator(std::iterator_traits<T>::iterator_category()); 
> > };
> >
> >   template<typename Tag> void checkIterator( Tag );
> >   void checkIterator( std::bidirectional_iterator_tag ) {};
> >   void checkIterator( std::random_access_iterator_tag ) {};
> >   void checkIterator( boost::random_access_traversal_tag ) {}; };
> >
> > This works when T is a standard iterator but not when it's 
> one of my 
> > iterator_facade subclasses. For example:
> >
> > class const_iterator : public 
> iterator_facade<const_iterator, const B, 
> > boost::random_access_traversal_tag, B>
> >
> > When using this class with A<const_iterator> I get a linker error 
> > because the checkIterator function is called with:
> >
> > boost::detail::iterator_category_with_traversal<struct
> > std::input_iterator_tag,struct boost::random_access_traversal_tag>
> >
> > I certainly cannot add a specialization of checkIterator 
> with this tag 
> > to class A.
> > Could anyone shed some light on this problem? I'm working 
> with Boost 
> > 1.39.0 on MSVC2008SP1.
> >   
> 
> Try just having a single overload:
> 
> void checkIterator(std::bidirectional_iterator_tag) {}
> 
> In Christ,
> Steven Watanabe
Unfortunately that doesn't work. Now it complains also about regular
random access iterators. Tags are apparently not automatically converted
into each other. 
Maybe I should keep the single templated checkIterator function and
determine the type of the tag using some MPL magic? I doubt I could come
up with such a solution myself as I never used it before. I made some
tests with boost::mpl::iterator_category but it looks like the iterator
should typedef 'category' instead of 'iterator_category'.
Thanks for the help so far.
Greets,
        Ben