c++ - 回调参数类型在继承类中不匹配

标签 c++ callback arguments inherited

我正在尝试根据此处顶部答案中的链接代码实现事件管理器: Game Objects Talking To Each Other

但是,当我尝试注册回调时出现错误。 我确定它与 typedef 有关,我承认我不确定它是如何工作的,但它在链接代码中的形式完全相同。 B类应该继承自Interface,为什么类型不一样呢? 我已将代码压缩为下面最小的示例。

#include <iostream>

class Interface;
typedef void (Interface::*Callback)(void *data);

class Interface
{
    public:
        void Register    (Callback func);

};

void Interface::Register(Callback func)
{
    std::cout << "Register" << std::endl;
}


class B : public Interface
{
    public:
        B();
        void Echo(void *data);
};

B::B()
{
    Register( (Callback)Echo );
}

void B::Echo(void *data)
{
    std::cout << "Echo" << std::endl;
}


int main()
{
    B b;
    return 0;
}

这是我在 g++ 4.6.1 下遇到的错误:

test.cpp: In constructor ‘B::B()’:
test.cpp:31:22: error: argument of type ‘void (B::)(void*)’ does not match ‘Callback {aka void (Interface::*)(void*)}’

谁能解释一下我做错了什么? 谢谢

最佳答案

作为@Kerrek正确指出,Echo 不是 Interface 的成员,因此 B::Echo 不符合 Interface::* 的条件回调。但是您可以使用模板来完成此操作,例如:

template <class T> class Interface {
public:
    typedef void (T::*Callback)(void *data);
    void Register(Callback func) {
        std::cout << "Register" << std::endl;
    }
    // ...
};

class B : public Interface<B> {
public:
    B() {
        Register(&B::Echo);
    }
    void Echo(void *data) {
        // Do something
    }
};

关于c++ - 回调参数类型在继承类中不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8496909/

相关文章:

c++ - 在 map 中如何将相同值的键收集到 vector 中?

javascript - 如何在 Coffeescript 中将函数作为参数传递

java - 构造函数: get type list from argument list

powershell - 使用空格传递计算路径

c - 如何将结构指针变量作为参数传递以便在 C 中对其进行编辑

c++ - 在链接 lib lua 的 mac os x 上编译动态库导致 "lua: multiple Lua VMs detected"

c++ - 如何使用主 C++ 程序构建声音相关库(不使用任何第三方库)

c++ - 在 C++ 中处理 fscanf 等效项的更好方法

javascript - 如何在 AngularJS 中通过回调分配变量作用域?

c++ - Delphi的回调函数在c中的使用方法