0

我正在尝试boost::trim在字符串向量上使用。我知道这个解决方案可以很好地工作,但是我不明白为什么

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在这里不起作用?

4

1 回答 1

1

我认为这有两个问题:

  1. ptr_fun要求其参数返回一个值。见: http ://www.sgi.com/tech/stl/ptr_fun.html

  2. bind2nd不适用于引用参数。请参阅:将 std::bind2nd 与引用一起使用

故事的寓意: 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()));

PS:(1)可能依赖于库。我刚刚尝试使用 g++ 并且返回 void 没有问题。

于 2012-10-05T23:41:17.127 回答