2017-09-24 171 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)和通用版本。 非常感谢! –