【发布时间】:2017-09-24 17:00:08
【问题描述】:
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 实现。
问题是当 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);
}
请注意,我已经尝试过指针/非指针调用的各种组合,所以我认为这不是问题所在。我尝试将 template <> 留空,就像您在其他专业中所做的那样,这会导致以下错误。
错误 C2912:显式特化 'void DataClass::WriteData2(Serialization::Object *,int)' 不是 函数模板的特化
所以,我的问题是如何让它在 Serialization::Object 上选择正确的 uint64 函数?我可以在 Serialization::Object 上实现一个 int 版本,但我不想为每种可能的类型编写一个特化。
【问题讨论】:
-
该错误消息表明与您所怀疑的完全不同。与
Serialization::Object无关。