I'm currently stuck finding the correct syntax for trimming each string in a std::vector.
I tried
std::vector<std::string> v;
std::for_each(v.begin(), v.end(), &boost::trim);
which gave me the following error messages in MSVC7.1.
error C2784: '_Fn1 std::for_each(_InIt,_InIt,_Fn1)' : could not deduce template argument for 'T1' from 'std::vector<_Ty>::iterator' with [_Ty=std::string] : see declaration of 'std::for_each'
error C2896: '_Fn1 std::for_each(_InIt,_InIt,_Fn1)' : cannot use function template 'void boost::algorithm::trim(SequenceT &,const std::locale &)' as a function argument : see declaration of 'boost::algorithm::trim'
If I explicitly give the template parameter trims second parameter can not be found by the compiler, though its set by default.
std::for_each(v.begin(), v.end(), &boost::trim<std::string>);
error C2198: 'void (__cdecl *)(std::string &,const std::locale &)' : too few arguments for call through pointer-to-function
I was won开发者_JAVA百科dering how the correct syntax to call trim for each element in v
would look like.
You need to bind as well the second parameter of trim (the locale):
std::vector<std::string> v;
std::for_each(v.begin(), v.end(),
boost::bind(&boost::trim<std::string>,
_1, std::locale() ));
精彩评论