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

时间:2012-04-12 14:41:28

标签: c++ parameter-passing

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

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”。我知道我的方式是错的,我搜索并发现了类似的问题,但无法理解(移位结束时的脑死亡:))其中任何一个完全适应我的问题。

我已经读过:http://www.parashift.com/c++-faq-lite/pointers-to-members.html:S

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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);

答案 2 :(得分:0)

在您的示例中,

fooCB必须是静态类成员:

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