在非类成员函数的参数中传递类成员函数

问题描述:

如何将类成员函数传递给非类成员函数的参数?我收到以下编译错误:在非类成员函数的参数中传递类成员函数

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

制作方法,你想传递的静态回调。你有这个错误,因为所有的方法都隐含有第一个参数 - 指向一个对象的指针,这个,所以它们的原型不符合回调'。

+0

使其成为静态的,就这么简单。谢谢,我应该采取更多的刹车:) – bmkorkut 2012-04-12 22:04:09

fooCB,在你的榜样,必须是类的静态成员:

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

的成员函数不是普通功能。
把它想象成一个带签名的函数 (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);