4

我正在尝试将某些类方法传递给某个函数并出现“函数调用缺少参数列表;使用 '& ' 创建指向成员的指针”错误。

//There is some class
class A {
  int someField;
  void Add(int someAdd) {
    someField += someAdd;
  }
}

//And function
void someFunc(std::function<void(int x)> handler) {
  //Some code
  handler(234);
}

//Class method pass to function
void main() {
  A* instanceA = new A();
  someFunc(instanceA->Add); //Error 19  error C3867: 'A::Add': function call missing argument list; use '&A::Add' to create a pointer to member
}

怎么了?

4

3 回答 3

10

C++ 没有绑定方法作为语言结构。写:

someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));
于 2013-02-04T10:18:38.693 回答
3

稍后传入参数时,您需要将std::bind与占位符一起使用:

#include <functional>
someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));

另请注意,您需要A::Add公开

class A {    
  int someField;

public:
  void Add(int someAdd) {
    someField += someAdd;
  }
};

另请注意,在 C++ 标准中没有void main

int main() 
{
    someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));
}
于 2013-02-04T10:22:34.000 回答
1

std::bind我想建议使用 lambda,而不是其他答案中的东西,因为这些在 imo 上更具可读性:

int main() {
  A* instanceA = new A();
  someFunc([=](int a1, int a2)
  {
    instanceA->Add(a1, a2);
  }); 
}   

我知道,如果 Add 需要四个、五个、...“BigN”参数,它会变得很长,因为你必须在 lambda 的参数列表中重复它们,但当然你知道如何编写干净的代码并且不提供Add带有“BigN”参数;-)

于 2013-02-04T13:47:38.523 回答