我试图将一些类方法传递给某个函数并使用"函数调用缺少参数列表;使用'& '创建指向成员的指针"错误。
//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
}
出了什么问题?
答案 0 :(得分:9)
C ++没有绑定方法作为语言构造。写:
someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));
答案 1 :(得分: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));
}
答案 2 :(得分:1)
而不是其他答案中的std::bind
内容我想建议使用lambdas,因为它们更具可读性:
int main() {
A* instanceA = new A();
someFunc([=](int a1, int a2)
{
instanceA->Add(a1, a2);
});
}
我知道,如果Add需要四个,五个......“BigN”参数,它会变得很长,因为你必须在lambda的参数列表中重复它们,但当然你知道如何编写干净的代码并且不要不为Add
提供“BigN”参数; - )