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));
}

这些在课堂外工作得很好,但我无法找到正确的方法在他们作为类成员的上下文中传递sep_to_space()' transforms 的第四个参数。如果我将它们注释掉,其他所有东西都会编译并正确运行。

以上&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?它不访问任何成员,显然也不需要。使其成为自由函数或静态成员,一切都很好。

但是,要回答一般问题,您需要将成员绑定到正在调用它的对象。

一种选择是使用bindC++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 可用,只需使用 lambda:

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));

(或 boost::bind)

于 2012-07-01T17:09:11.620 回答