Here is the work around: class A { ... private: typedef struct _ONE_RECORD_ { string sGUID; string sID; string sName; string sSupport; string sModify; } ONE_RECORD; vector<ONE_RECORD> m_v; private: void FillOneLine(const ONE_RECORD& one_line); void FillAllLines(); }; void A::FillAllLines() { ... // method 1 for_each(m_v.begin(), m_v.end(), boost::bind(&A::FillOneLine, this,_1)); // OK // method 2 for_each(m_v.begin(), m_v.end(), boost::bind(&A::FillOneLine, this, ref(_1))); // error ... } Since ONE_RECORD can be large, I prefer to calling bind() as method 2, but, compiled under VC7.1 it generates such an error: e:\Boost\include\boost-1_32\boost\bind.hpp(285): error C2664: 'R boost::_mfi::mf1<R,T,A1>::operator ()<A>(U & ,A1) const' : cannot convert parameter 2 from 'boost::arg<I>' to 'A::ONE_RECORD' with [ R=void, T=A, A1=A::ONE_RECORD, U=A * ] and [ I=1 ] Can any body help to explain why and give a solution? Thanks.