我的基类中有一个声明:
template<class PROTOCOL>
static Packet* serialize(uint packetId, QVariantHash data = QVariantHash());
然后当我从基类继承时,我可以像这样使用静态方法:
GameProtocol::serialize<GameProtocol>(0); // This works fine
我的问题是,为了使调用GameProtocol::serialize(0)
有效,我需要做些什么改变(即没有模板声明)。
我想保持方法静态,因为它简化了基类的其他区域。我理解这很难,因为静态方法不能在C ++中被覆盖,但肯定必须有一种使用模板魔法的方法。
答案 0 :(得分:1)
似乎GameProtocol
碰巧是你的派生类:只需添加一个static
方法serialize()
,它转发到适当的基类版本:
class GameProtocol: public Protocol {
// ...
public:
static Packet* serialize(uint id,
QVariantHash h = QVariantHash()) {
return Protocol::serialize<GameProtocol>(id, h);
}
// ...
};
答案 1 :(得分:0)
只需在GameProtocol类中编写另一个封装模板函数的函数:
static Packet* serialize(int packetId, QVariantHash data = QVariantHash()) {
return serialize<GameProtocol>( packetId, data );
}
现在你可以摆脱模板:
GameProtocol::serialize(0);