2015-04-06 107 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); 
相關問題