2012-04-12 115 views
0

如何將類成員函數傳遞給非類成員函數的參數?我收到以下編譯錯誤:在非類成員函數的參數中傳遞類成員函數

error: argument of type ‘void (MyNamespace::MyClass::)(int*)’ does not match ‘void (*)(int*)’ 

Library.h

typedef void (*testCallback)(int* iParam); 
void UsingTheFoo(testCallback Callback); 

Library.cpp

void UsingTheFoo(testCallback Callback) 
{ 
    int *p_int = new int; 
    *p_int = 5; 
    Callback(p_int); 
} 

MyClass.cpp

namespace MyNamespace 
{ 

    void MyClass::fooCB(int* a) 
    { 
     printf("hey! %d\n", *a); 
    } 


    void MyClass::testo() 
    { 
     UsingTheFoo(fooCB); 
    } 

} // MyNamespace 

我不能更改「庫」中的代碼,我需要在MyClass成員函數中使用「UsingTheFoo」。我知道我的方式是錯誤的,我搜索了一下,發現了類似的問題,但無法理解(轉換結束時的braindead :))其中任何一個都完全適應我的問題。

我已經閱讀:http://www.parashift.com/c++-faq-lite/pointers-to-members.html:S

回答

2

製作方法,你想傳遞的靜態回調。你有這個錯誤,因爲所有的方法都隱含有第一個參數 - 指向一個對象的指針,這個,所以它們的原型不符合回調'。

+0

使其成爲靜態的,就這麼簡單。謝謝,我應該採取更多的剎車:) – bmkorkut 2012-04-12 22:04:09

0

fooCB,在你的榜樣,必須是類的靜態成員:

class MyClass { 
public: 
    static void MyClass::fooCB(int* a); 
    ... 
} 
1

的成員函數不是普通功能。
把它想象成一個帶簽名的函數 (className * pthis,...) 其中..是您想到的簽名。 你仍然可以做到這一點,但你會想要std/boost :: bind和一個函數對象而不是回調。或者像其他人發佈的那樣,您可以將其設爲靜態。

所以也許你可能要像

typedef function<void (int*)> TCallback 
void UsingTheFoo(TCallback, Callback); 

MyClass class_object 

與回調

TCallback cb = bind(std::ref(class_object),MyClass::fooCB);