以下のクラス HandleMessages には、タイプ ProtocolDecoder* のメンバー変数があります。ProtocolDecoder がテンプレート クラスではない場合、これは問題ありませんでした。今はそのように変更しましたが、コードはコンパイルされません。
実行時に、必要なデコーダーを作成するファクトリー関数があります。
メンバー m_Decoder を持てない場合、どうすれば同じ効果を達成できますか?
メンバーを ProtocolDecoder* m_Decoder; として宣言しようとすると、
コンパイラ エラーが発生します: エラー C2059: 構文エラー: '<'
コンパイルされているクラス テンプレートのインスタンス化 'LogPlayer' への参照を参照してください。
template <typename T>
class ProtocolDecoder
{
public:
virtual const char* ProtocolName() = 0;
virtual ProtoWrapper<T>* DecodeMsg(const unsigned char* msg, int length) = 0;
...
};
class ABCDecoder : public ProtocolDecoder<ABC_msg>
{
public:
virtual const char* ProtocolName() {return "ABC"; }
virtual ProtoWrapper<ABC_msg>* DecodeMsg(const unsigned char* msg, int length);
};
//lots of different decoders derived from ProtocolHandler
class HandleMessages
{
public:
void Process() {}
private:
//ProtocolDecoder<T>* m_Decoder; //Want a Protocol member variable - but don't know type until runtime
};