Boost logo

Boost Users :

Subject: Re: [Boost-users] iterator adaptor not inheriting pointer typedef
From: Matei David (matei_at_[hidden])
Date: 2014-11-07 19:26:00


On Thu, 6 Nov 2014 22:02:28 -0500
Matei David wrote:

> I have some questions about the Boost Iterator library.
>
> I've recently discovered the "hard way", meaning through impenetrable
> TMP error messages :), that when using boost::iterator_adaptor, the
> derived iterator type does not (always??) inherit the pointer typedef
> of the base iterator type. I mean, the iterator_adaptor glue class
> does not have this typedef.
>
> So, for example, I have a Base_Iterator type with:
> Base_Iterator::pointer != Base_Iterator::value_type*
>
> If I do:
> class Derived_Iterator : public boost::iterator_adaptor<
> Derived_Iterator, Base_Iterator > {...}
>
> then, strangely I find:
> Derived_Iterator::value_type == Base_Iterator::value_type (OK)
> Derived_Iterator::pointer == Base_Iterator::value_type* !=
> Base_Iterator::pointer (not OK)
>
> I looked at the documentation, and I did find a mention of this, but
> only for iterator_facade, here:
> http://www.boost.org/doc/libs/develop/libs/iterator/doc/iterator_facade.html
>
> The corresponding page for iterator_adaptor does not mention the
> pointer typedef at all. While for facade using a plain pointer seems
> ok (no other reasonable default), I would argue that for adaptor this
> is not ok. Is this expected behaviour or a bug?
>
> Within the same setting, and in what could be a related issue, I also
> found that the intermediate boost::iterator_adaptor<> class does not
> seem to contain the default/common sense definition:
> Base_Iterator operator->() const { return this->base(); }
>
> I didn't look inside the source code of boost::iterator_adaptor, but
> I found a situation where I have to put this definition explicitly
> inside Derived_Iterator for my code to compile (without it, it
> doesn't). Does this sound like expected behaviour?

Some clarifications... I used some words like "inherit" and
"missing" in the wrong way.

There are 3 classes involved here:
- Derived_Iterator: my class
- iterator_adaptor<Derived_Iterator,Base_Iterator,...>: base class of
  Derived_Iterator, provided by the Boost Iterator lib
- Base_Iterator: existing class, unrelated to either of the above by
  inheritance

In my situation, the typedef Base_Iterator::pointer exists and is not
trivial/plain. I would expect that iterator_adaptor<> provides (not
"inherits") this typedef. What I observe is that the typedef exists
(it's not "missing"), but it's unexpectedly a plain pointer.

I posted a bug report and code reproducing the problem here:
https://svn.boost.org/trac/boost/ticket/10769


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