2013-02-04 223 views
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 
} 

怎么了?

+3

请注意'void main'是错误的,'main'的返回类型必须是'int'。 –

+0

如果添加多个参数(例如3,4),该怎么办? – Vovanok

回答

8

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

someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1)); 
+0

错误C2064:术语不评估为带有2个参数的函数\t c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ functional on line _VARIADIC_EXPAND_0X(_CLASS_BIND,,,,) – Vovanok

+0

如果添加采取许多参数(例如3,4)? – Vovanok

+1

@Vovanok你需要添加'std :: placeholders :: _ 2,std :: placeholders :: _ 3'等。 – ecatmur

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

错误C2064:术语不会评估到采用2个参数的函数\t c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ functional在线_VARIADIC_EXPAND_0X(_CLASS_BIND,,,) – Vovanok

+0

也许您的绑定isn' t正确吗?它在我的电脑上工作得很好 – billz

1

,而不是在其他的答案,我想提出lambda表达式的用法std::bind的东西,因为这些是国际海事组织更可读:

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

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

+0

在我看来,lambda的可读性较差。额外的间接级别(“调用这个lambda,调用这个方法”)让我看看还有什么事情发生。同时,std :: bind显然只是寻找一种方法来执行该方法。话虽如此,看到不同的问题并有不同的选择总是很好的。 +1。 – GrandOpener