1

ポリモーフィックプロトコルハンドラーを実装していますが、基本クラスで、テンプレート関数パラメーターが指定されていない純粋仮想関数が必要です。しかし、私のコンパイラは文句を言っています。これはできないと思います。これを達成する方法について誰か提案はありますか?可能であれば?そうでなければ、私は多形の考えを捨てなければならないでしょう。

これがエラーC2976'ProtoWrapper'を与える​​私のコードです:テンプレート引数が少なすぎます。コンパイラ=MSVC++2008。

#include "smartptrs.hpp"
#include <iostream>

class realproto {
public:
   const char* getName() const { return "realproto"; }
}; 

class real2ndproto {
public:
   const char* get2Name() const { return "real2ndproto"; }
}; 


template<typename T>
class ProtoWrapper : public ref_type {
public:
   ProtoWrapper(T* real) : m_msg(real) {}
   ~ProtoWrapper() { delete m_msg; }  //cannot have smart ptr on real_proto - so do this way

   T* getMsg() { return m_msg; }

private:
   T* m_msg;
};


class ProtocolDecoder 
{
public:
  virtual void Parse(ProtoWrapper<>* decoded_msg) = 0;  //problem line - compile error
};

class CSTA2Decoder  : public ProtocolDecoder
{
public:
   virtual void Parse(ProtoWrapper<realproto>* decoded_msg) {
      realproto* pr = decoded_msg->getMsg();
      std::cout << pr->getName() << std::endl;
   }
};


int main(int argc, char* argv[])
{
   {
      ref_ptr<ProtoWrapper <realproto> > msg2 = new ProtoWrapper<realproto>(new realproto);

      realproto* pr1 = msg2->getMsg();

      std::cout << "created new realproto\n";
   } 

    return 0;
}
4

3 に答える 3

3

さまざまなテンプレートの特殊化は、基本的に無関係なタイプです。テンプレートを関数に渡すことはできません。タイプ(特殊化)を渡す必要があり、異なるインスタンス化の間に共通性はありません。その他の場合は、テンプレートを使用して、関数を特殊化するときにコンパイラーに複数のオーバーロードを生成させることができますが、仮想テンプレートメンバー関数を使用することはできません。

最も簡単なアドバイスは、クラステンプレートの基本クラスを作成し、それを渡すことです。Parse関数がデコードされた情報に基づいてオブジェクトを作成する場合は、ポインターではなくポインターへの参照を渡す必要があります。関数はメッセージを作成できます。一方、渡されたオブジェクトがDecodeメッセージの解釈方法を決定する場合は、型情報を提供する必要があります(RTTI(つまり、実行できるように少なくとも仮想関数dynamic_cast)、または手動で作成する)。

ちなみに、なぜスマートポインタを使用できないのreal_protoですか?

于 2012-11-09T13:49:43.290 に答える
0

これを実現するProtocolDecoderには、クラステンプレートに変換する必要があります。

template <typename T>
class ProtocolDecoder 
{
public:
  virtual void Parse(ProtoWrapper<T>* decoded_msg) = 0;  //problem line - compile error
};

class CSTA2Decoder  : public ProtocolDecoder<realproto>
{
  //...
};
于 2012-11-09T13:47:47.537 に答える
0

Decoderクラスをテンプレートのように単純にデクレートできないのはなぜですか?

template<typename T>
class ProtocolDecoder 
{
public:
  virtual void Parse(ProtoWrapper<T>* decoded_msg) = 0;  //problem line - compile error
};

挿入するときは、タイプを入力してください

class CSTA2Decoder  : public ProtocolDecoder<your type>
{}
于 2012-11-09T13:49:35.363 に答える