gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:13:01 25 4
gpt4 key购买 nike

我正在尝试根据此处顶部答案中的链接代码实现事件管理器: 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com