"Jeff Flinn"
I'm having problems compiling the code below with boost_1_30_2 and VC71 complaining about:
...\Microsoft Visual Studio .NET 2003\Vc7\include\xutility(489) : error C2665: 'std::_Distance2' : none of the 4 overloads can convert parameter 4 from type 'std::iterator_traits<_Iter>::iterator_category' with [ _Iter=CDictionary::tVarConstItr ] ...
Replacing with std::distance( lBeg.base(), lItr.base() ) does compile and work properly. Am I missing something in the typedef of tVarConstItr that would allow direct usage?
No, you've got the order of the parameters to indirect_iterator_generator wrong. I suggest you let the library defaults take effect instead. typedef boost::indirect_iterator_generator < tVars::const_iterator , tVar const
::type tVarConstItr;
typedef boost::indirect_iterator_generator < tVars::const_iterator , tVar ::iterator_category
::type tVarItr;
But you'll have a bigger problem. IIRC the version of iterator adaptors in 1.30.2 doesn't support indirect iterators over shared_ptr. Go ahead and try it, but if you have trouble you may want to switch to the (much easier-to-use) version of the library in the CVS, which explicitly *does* support that usage.
----------------------------------------------------------
class CDictionary { ...
class VarSpec { ... typedef boost::shared_ptr<VarSpec> tPtr; };
typedef VarSpec tVar; typedef tVar::tPtr tVarPtr; typedef std::vector<tVarPtr> tVars;
typedef boost::indirect_iterator_generator < tVars::const_iterator , tVar , tVar& , tVar* , std::iterator_traitstVars::const_iterator ::iterator_category
::type tVarConstItr;
typedef boost::indirect_iterator_generator < tVars::iterator , tVar , tVar& , tVar* , std::iterator_traitstVars::iterator ::iterator_category
::type tVarItr;
-- Dave Abrahams Boost Consulting www.boost-consulting.com