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

これには2つの問題があると思います。

  1. ptr_funその引数が値を返す必要があります。参照: http ://www.sgi.com/tech/stl/ptr_fun.html

  2. bind2nd参照引数では機能しません。参照:参照を使用したstd::bind2ndの使用

物語の教訓: boost::bind衝撃的な量の複雑さを隠します。

本当に機能させたいが、文字列/ロケールを値で渡すことを気にしない場合は、次のようにトリムをラップできます。

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 に答える