2017-09-24 86 views
0
template <class MyType> 
class DataClass 
{ 
public: 
    virtual void WriteData(Serialization::Object* obj) override 
    { 
     obj->Write(m_myData); 
    } 

private: 
    MyType* m_myData; 
}; 

Serlialization :: Object知道如何編寫特定類型:uint64,double,string。其通用<T>實現保持未實現static_assert。C++模板專業化。你如何選擇特定的類型?

問題是當MyType是int它選擇通用實現。我希望它選擇uint64版本。我試圖在DataClass上添加一個專門化,但它仍然更喜歡通用實現。 <class T>

virtual void WriteData(Serialization::Object* obj) override 
{ 
    WriteData2(obj, m_myData); 
} 

template <int> 
void WriteData2(Serialization::Object* obj, int* data) 
{ 
    uint64 lData = *data; 
    obj->Write(lData); 
} 

template <class T> 
void WriteData2(Serialization::Object* obj, T* data) 
{ 
    obj->Write(*data); 
} 

請注意,我試過的指針/非指針調用各種組合,所以我不認爲這是問題。我試圖像在其他專業領域那樣留下空白,導致以下錯誤。

錯誤C2912:明確的專業化 '無效 DATACLASS :: WriteData2(連載:對象*,INT)' 不是 一個函數模板的專業化

所以,我的問題是怎麼做的我可以在Serialization :: Object中選擇正確的uint64函數嗎?我只能在Serialization :: Object上實現一個int版本,但我不想爲每種可能的類型編寫專門化。

+0

該錯誤消息表示完全不同的東西比你懷疑它。與'Serialization :: Object'無關。 – user0042

回答

0

嘗試從類的外部如下:

template <> 
void DataClass<int>::WriteData2(Serialization::Object* obj, int* data) { 
    uint64 lData = *data; 
    obj->Write(lData); 
} 
+0

啊!很接近。因爲DataClass是模板化的它只需要專門化原始的WriteData。 DataClass :: WriteData(Serialization :: Object * obj)和通用版本。 非常感謝! –