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? ---------------------------------------------------------- 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_traits<tVars::const_iterator> ::iterator_category
::type tVarConstItr;
typedef boost::indirect_iterator_generator < tVars::iterator , tVar , tVar& , tVar* , std::iterator_traits<tVars::iterator> ::iterator_category
::type tVarItr;
tGroups Groups()const{ return mGroups; } tVarItr VarBegin() { return tVarItr ( mVars.begin() ); } tVarItr VarEnd () { return tVarItr ( mVars.end () ); } tVarConstItr VarBegin()const{ return tVarConstItr( mVars.begin() ); } tVarConstItr VarEnd ()const{ return tVarConstItr( mVars.end () ); } }; usage: ------ int CDictionaryEditorView::Idx( const TCHAR* aChrPtr, bool aExact )const { boost::function1<bool,const CDictionary::VarSpec&> lFindFnc; if( aExact ) { lFindFnc = boost::bind( std::equal_to<std::string>() , std::string(aChrPtr) , boost::bind( &CDictionary::VarSpec::Name, _1 ) ); } else { //... } CDictionary::tVarConstItr lBeg = mDctPtr->VarBegin(); CDictionary::tVarConstItr lEnd = mDctPtr->VarEnd (); CDictionary::tVarConstItr lItr = std::find_if( lBeg, lEnd, lFindFnc ); return (lItr!=lEnd)? std::distance( lBeg, lItr ) : -1; } -- Jeff Flinn Applied Dynamics, International