|
Boost Users : |
From: David Abrahams (dave_at_[hidden])
Date: 2004-01-04 13:34:58
"Keith MacDonald" <boost_at_[hidden]> writes:
> Hi,
>
> I'm stuck trying to use iterator_adaptor from the CVS head. I simply want
> to derive a non-const iterator from a const one derived from
> iterator_facade, as shown in the code below.
Answer: don't do that. Making iterators by derivation from other
iterators is almost always an error (and in your case also: for
example the return type of operator++ is wrong on the derived
iterator). Make a new constant iterator type with iterator_facade.
If you do it right, it will interoperate properly with your mutable
iterator.
> When I compile it with VC7.1,
> the line marked "/* *ERROR* */" generates one of those impenetratable error
> messages that starts with:
>
> cannot convert from 'const Node' to
> 'boost::iterator_facade<Derived,Value,CategoryOrTraversal,Reference,Differen
> ce>::reference'
Compile with GCC; you'll get better error messages. The type
'boost::iterator_facade<Derived,Value,CategoryOrTraversal,Reference,Difference>::reference'
is almost certainly 'Node&', which can't be bound to a 'const Node'.
> If I delete that line, so the default is used, dereferencing a non-const
> iterator returns a const Node. This seems such a simple requirement that
> there must be an easy way to do it. What am I doing wrong?
Looks like a job for iterator_adaptor:
// untested
template <class V>
struct iter
: boost::iterator_adaptor<iter<V>, V*, V, boost::bidirectional_traversal_tag>
{
typedef
boost::iterator_adaptor<iter<V>, V*, V, boost::bidirectional_traversal_tag>
super;
iter() {}
template <class V2>
iter(iter<V2> x, boost::enable_if_convertible<V2*,V*>::type* = 0)
: super(x.base())
friend class iterator;
friend class boost::iterator_core_access;
private:
void increment()
{ base() = base()->next(); }
void decrement()
{ base() = base()->prev(); }
};
typedef iter<Node> iterator;
typedef iter<Node const> const_iterator;
HTH,
-- Dave Abrahams Boost Consulting www.boost-consulting.com
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net