我正在实现多态协议处理程序,在我的基类中,我希望有一个纯虚函数,其中未指定模板函数参数。但我的编译器抱怨。我想这不可能做到。任何有关如何实现这一目标的建议?如果可能的话?否则我将不得不废弃多态的想法。
这是我的代码,它给了我错误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;
}
答案 0 :(得分:3)
不同的模板专业化基本上是不相关的类型。您无法将模板传递给函数,您需要传递类型(特化),并且不同实例之间没有共性。在其他情况下,您可以使用模板并让编译器在您专门化函数时生成多个重载,但您不能拥有虚拟模板成员函数。
最简单的建议是为类模板创建一个基类并将其传入。如果Parse
函数将根据解码的信息创建对象,那么您将需要传递对指针的引用,而不是指针,以便该函数可以创建消息。另一方面,如果传入Decode
的对象决定了如何解释消息,那么您将需要提供类型信息(RTTI - 至少是一个虚函数,以便您可以{{1} } - 或手动制作你自己的。)
另外,为什么你不能在dynamic_cast
使用智能指针?
答案 1 :(得分: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>
{
//...
};
答案 2 :(得分: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>
{}