基本クラスが次のメッセージ ハンドラーを作成しようとしています。
1ハンドラー基本クラス
適切なメッセージ タイプの適切なハンドラーを生成する 2-Handler ファクトリ
3-メッセージの基本ジェネリック クラス
彼らのコードは次のようなものです:
#include <map>
#include<iostream>
//Base Handler
template<class MSG>
class Handler
{
MSG message;
public:
Handler(MSG message):message(message){
}
virtual void handle() = 0;
MSG getMessage()
{
return message;
}
};
//Base Handler Factory
template<class MSG>
class HandlerFactory {
public:
virtual Handler<MSG> * create(MSG & message) = 0;
};
//Base message
template<class T>
class Message
{
T messageType;
public:
T getMessageType()
{
return messageType;
}
void setMessageType(T messageType_)
{
messageType = messageType_;
}
};
//次に、メッセージ タイプに基づいて、すべての基本クラスのサブクラスを記述します。
//my custom types
enum MessageType
{
ANNOUNCE,
KEY_SEND,
KEY_REQUEST
};
//my first custom message format
class MyMessage_1 : public Message<MessageType>
{
//...
};
//my first custom handler
class MyMessageHandler_1 : public Handler<MyMessage_1>
{
public:
MyMessageHandler_1(MyMessage_1 &message_): Handler<MyMessage_1>(message_)
{
}
void handle(){}
};
//my custom handler factory
class MyHandlerFactory : public HandlerFactory<Message<MessageType> > {
Handler<Message<MessageType> > *value;
public:
MyHandlerFactory(){};
Handler<Message<MessageType> > * create(Message<MessageType> & message){
switch (message.getMessageType())
{
case ANNOUNCE:
MyMessage_1 t1;
value = new MyMessageHandler_1(t1);//error here
break;
//etc. etc.
default:
value = 0;
break;
};
return value;
};
};
//簡単にコンパイルできるように main を入れましょう
int main()
{
}
問題は、switch-case 句で、カスタム メッセージ クラスの 1 つのハンドラーのインスタンスを作成しようとすると、次のエラーが発生することです。
templateArgList.cpp: In member function ‘virtual Handler<Message<MessageType> >* MyHandlerFactory::create(Message<MessageType>&)’:
templateArgList.cpp:86:37: error: cannot convert ‘MyMessageHandler_1*’ to ‘Handler<Message<MessageType> >*’ in assignment
Handler<Message<MessageType> > *
私は次のようにキャストできるという印象を受けました
:
MyMessageHandler_1-> Handler<MyMessage_1>
^
|
`Message<MessageType>` which finally gives me:
`Handler<Message<MessageType> >` :P
私が間違っている?もちろん、私はなぜ上記のエラーが発生するのでしょうか :)) 理由と修正方法がわかりません。そのため、親切に私を助けていただければ幸いです。
あなたの親切な助けをどうもありがとう