2015-04-06 92 views
1

我有一个声明,在我的基类:我怎样才能避免使用类型名称类型

template<class PROTOCOL> 
static Packet* serialize(uint packetId, QVariantHash data = QVariantHash()); 

然后,当我从基类继承,我可以像使用静态方法,以便:

GameProtocol::serialize<GameProtocol>(0); // This works fine 

我的问题是,为了使电话GameProtocol::serialize(0)工作(即没有模板声明),我必须更改什么。

我想保持静态方法,因为它简化了基类的其他区域。我明白这使得C++中无法重写静态方法变得困难,但肯定有一种使用模板魔法的方法。

+1

'GameProtocol'是基类还是派生类? – aschepler

回答

1

看来GameProtocol恰好是你的派生类:只需添加一个static方法serialize()转发给基类的相应版本:

class GameProtocol: public Protocol { 
    // ... 
public: 
    static Packet* serialize(uint id, 
     QVariantHash h = QVariantHash()) { 
     return Protocol::serialize<GameProtocol>(id, h); 
    } 
    // ... 
}; 
+0

是的,这个解决方案为我工作。不过,由于编译器开始抱怨,必须将基类中的方法从静态移动到正常。谢谢! –

0

只需编写包裹模板函数在GameProtocol另一个函数类:

static Packet* serialize(int packetId, QVariantHash data = QVariantHash()) { 
    return serialize<GameProtocol>(packetId, data); 
} 

现在你可以摆脱模板:

GameProtocol::serialize(0);