$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [iterator adaptor] requires default constructor?
From: Neal Becker (ndbecker2_at_[hidden])
Date: 2010-06-11 21:14:53
IIUC, in typical usage, the default constructor will be called.
Here is my example:
template<typename BaseIterator, typename offset_t>
class cycle_iterator : public
boost::iterator_adaptor<cycle_iterator<BaseIterator, offset_t>,
BaseIterator
>
{...
typedef typename boost::iterator_adaptor<cycle_iterator<BaseIterator,
offset_t>,
BaseIterator
> super_t;
explicit cycle_iterator (BaseIterator const& _b, BaseIterator const& _e,
offset_t offset=0) :
base(_b),
size (std::distance (_b, _e)) {
SetPos (offset);
}
...
BaseIterator base;
};
This is a bit confusing. IIUC, the issue is that we did not explicitly
invoke the super_t constructor, so we got the default constructor, which in
turn calls (iterator_adaptor.hpp:280)
iterator_adaptor() {}
Adding an explicity super_t constructor call fixes it:
explicit cycle_iterator (BaseIterator const& _b, BaseIterator const& _e,
offset_t offset=0) :
super_t (_b),
base(_b),
size (std::distance (_b, _e)) {
SetPos (offset);
}
But is not very obvious.