
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.