我正尝试在字符串向量上使用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不能在这里工作?
发布于 2012-10-06 07:41:17
我认为这有两个问题:
ptr_fun要求其参数返回值。请看:http://www.sgi.com/tech/stl/ptr_fun.htmlbind2nd不适用于引用参数。请参阅: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()));附注:(1)可能依赖于库。我刚刚尝试了g++,它没有一个空返回的问题。
https://stackoverflow.com/questions/12755060
复制相似问题