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

为什么你不能像模板一样简单地将解码器类声明为模板?

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 回答
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 回答