ここの一番上の回答のリンクされたコードに基づいてイベントマネージャーを実装しようとしています: Game Objects Talking To Each Other
ただし、コールバックを登録しようとするとエラーが発生します。typedef に関係していることは確かです。正確にどのように機能するかはわかりませんが、リンクされたコードではまったく同じ形式になっています。B クラスはインターフェイスから継承する必要があるのに、なぜ型が異なるのでしょうか。コードを以下の最小の例に要約しました。
#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*)}’
誰かが私が間違っていることを説明してもらえますか? ありがとう