我正在尝试在字符串向量上使用boost::trim
。我理解this solutions优雅,但我无法理解为什么
std::for_each(df.colnames.begin(), df.colnames.end(),
std::bind2nd(std::ptr_fun(boost::trim<std::string>), std::locale()));
不起作用。我收到错误:
error: ‘typename _Operation::result_type std::binder2nd<_Operation>::operator()(typename _Operation::first_argument_type&) const [with _Operation = std::pointer_to_binary_function<std::basic_string<char>&, const std::locale&, void>; typename _Operation::result_type = void; typename _Operation::first_argument_type = std::basic_string<char>&]’ cannot be overloaded
为什么std::bind2nd
在这里不起作用?
答案 0 :(得分:1)
我认为这有两个问题:
ptr_fun
要求其参数返回一个值。看到:
http://www.sgi.com/tech/stl/ptr_fun.html
bind2nd
不适用于引用参数。请参阅:Using std::bind2nd with references
故事的道德:
boost::bind
隐藏了令人震惊的复杂性。
如果你真的想让它工作而不关心按值传递字符串/语言环境,你可以按如下方式包裹trim:
int trim2(std::string s, const std::locale loc)
{
boost::trim<std::string>(s, loc);
return 0;
}
然后做:
std::for_each(df.colnames.begin(), df.colnames.end(),
std::bind2nd(std::ptr_fun(trim2), std::locale()));
P.S :( 1)可能与库有关。我只是尝试使用g ++,它没有出现void返回的问题。