2013-02-04 434 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