2

次のようなクラスがあります。

class A
{
    public:
        class variables_map vm /*! A boost::program_options variable map containing all program_options in use. */;
        char sep_to_space(char c);
        template <typename T>
        void VectorFromOption(char * sOption, vector<T> & n);
};

char A::sep_to_space(char c){
  return c == ',' || c == '<' || c == '>' ? ' ' : c;
}

template <typename T>
void A::VectorFromOption(char * sOption, vector<T> & n)
    string s=A::vm[sOption].as<string>();
    transform(s.begin(), s.end(), s.begin(), &A::sep_to_space );
    stringstream ss(s);
    copy(istream_iterator<T>(ss), istream_iterator<T>(), std::back_inserter(n));
}

これらはクラス外では正常に動作しますが、クラス メンバーであるというコンテキストで の 4 番目のパラメーターsep_to_space()として渡す正しい方法が見つかりません。transformそれらをコメントアウトすると、他のすべてが正しくコンパイルおよび実行されます。

上記&A::sep_to_spaceは不可解なエラーを生成します:

1>c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\algorithm(671) : error C2064: term does not evaluate to a function taking 1 arguments

それは現在私の頭の中にありますが、残念です。提案?

4

2 に答える 2

2

sep_to_spaceの(非静的)メンバーでさえあるのはなぜAですか?どのメンバーにもアクセスせず、明らかにその必要もありません。それを無料の関数または静的メンバーにすると、すべて問題ありません。

ただし、一般的な質問に答えるには、メンバーが呼び出されているオブジェクトにメンバーをバインドする必要があります。

1 つのオプションはbind、C++11 または Boost の関数を使用することです。

#include <functional> // or <boost/bind.hpp>

using std::placeholders::_1; // placeholder for the first argument
std::transform(s.begin(), s.end(), s.begin(), std::bind(&A::sep_to_space, this, _1));

または、とにかく C++11 が既に利用可能な場合は、ラムダを使用してください。

std::transform(s.begin(), s.end(), s.begin(),
    [this](char c){
      return sep_to_space(c);
    });
于 2012-07-01T17:21:51.333 に答える
0

試す:

using std::placeholders::_1;
transform(s.begin(), s.end(), s.begin(), std::bind( &A::sep_to_space, this, _1));

(またはブースト::バインド)

于 2012-07-01T17:09:11.620 に答える