Boost logo

Boost Users :

From: David Abrahams (dave_at_[hidden])
Date: 2004-01-07 14:15:54

"Keith MacDonald" <boost_at_[hidden]> writes:

> I've done that, and attach the new source. However, I hereby relinquish all
> rights over baz2.cpp, so feel free to do whatever you like with it.
> When I attempted to integrate the iterators with my actual code, I hit a
> problem that I don't know how to resolve with iterator_facade. To
> illustrate it, I've modified the example code and attach it as baz3.cpp.
> Now, Node is an abstract base class, and DerivedNode is instantiated.
> Compiling it results in the following error:
> \CVS\boost\boost\iterator\iterator_facade.hpp(389) : error C2259:
> 'Node' : cannot instantiate abstract class due to following members:
> 'int Node::getInfo(void) const' : pure virtual function was not defined
> Can your technique be used in such contexts?

Very interesting case. The problem is that, when the iterator is not
writable, operator[] returns an object of the iterator's
value_type. In this case the value_type is abstract, so it can't be

This raises several problems that I can see.

1. Obviously, the library doesn't work for you. You can get around
   that by applying the enclosed patch to iterator_facade.hpp. We'll
   figure out the right long-term fix soon; this one might be it.

2. We have to re-think the readable iterator requirements if we want
   iterators over abstract types to be legal. My feeling is that the
   requirement should be that *a is convertible to value_type const&.

3. Your iterator isn't a legal random access iterator, because the
   random access iterator requirements say that a[n] must be
   convertible to value_type. You can't convert anything to
   value_type in this case, since it can't be constructed. I think
   this is a defect in the current standard, and will submit a DR.

Dave Abrahams
Boost Consulting

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at