|
Boost : |
From: Joerg Walter (jhr.walter_at_[hidden])
Date: 2002-05-27 01:51:29
----- Original Message -----
From: "John Maddock" <john_maddock_at_[hidden]>
To: <boost_at_[hidden]>
Sent: Friday, May 24, 2002 1:15 PM
Subject: Re: [boost] Recent config changes?
> OK the changes have been undone, and the docs updated to remove the
> references to reverse_iterator.
Ok.
> > The main problem concerned std::reverse_iterator. After porting to
> > boost.config we usually distinguish MSVC and non MSVC environments
> regarding
> > iterators in the following way:
> >
> > #ifdef BOOST_MSVC_STD_ITERATOR
> >
> > template <class I, class T, class R>
> > class reverse_iterator:
> > public std::reverse_iterator<I, T, R> {
> > ...
> > };
> >
> > #else
> >
> > template <class I>
> > class reverse_iterator:
> > public std::reverse_iterator<I> {
> > ...
> > };
> >
> > #endif
> >
> > This failed for one of our users with MSVC 6.0 and STL-Port 4.5.3. After
> > some investigation I found the following defininition in
_iterator_old.h:
>
> You could use:
>
> #if defined(BOOST_MSVC_STD_ITERATOR)\
> || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
>
> However, that doesn't work for vc7 which has a conforming signature for
> reverse_iterator but no partial specialisation support (so it doesn't work
> with pointers). If you need to use reverse_iterator with pointers then
you
> will need to do the same thing that array.hpp does:
>
> #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) &&
> !defined(BOOST_MSVC_STD_ITERATOR)
> typedef std::reverse_iterator<iterator> reverse_iterator;
> typedef std::reverse_iterator<const_iterator>
> const_reverse_iterator;
> #elif defined(BOOST_MSVC) && (BOOST_MSVC == 1300)
> // workaround for broken reverse_iterator in VC7
> typedef std::reverse_iterator<std::_Ptrit<value_type,
> difference_type, iterator,
> reference, iterator, reference> >
> reverse_iterator;
> typedef std::reverse_iterator<std::_Ptrit<value_type,
> difference_type, const_iterator,
> const_reference, iterator, reference> >
> const_reverse_iterator;
> #else
> // workaround for broken reverse_iterator implementations
> typedef std::reverse_iterator<iterator,T> reverse_iterator;
> typedef std::reverse_iterator<const_iterator,T>
> const_reverse_iterator;
> #endif
This will even solve another problem recently reported: indeed some of our
reverse_iterators currently don't work with MSVC70.
Thanks for the valuable hint.
Regards
Joerg
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk