我正在尝试根据此处最佳答案中的链接代码实现事件管理器: 游戏对象相互交谈
但是,当我尝试注册回调时出现错误。我确信它与 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*)}’
谁能解释我做错了什么?谢谢