2017-09-24 1 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); 
} 

주, 그래서 나는 그 문제라고 생각하지 않습니다. 나는 당신이 다른 전문 분야에서하는 것처럼 template <>을 공백으로 남기려고했는데 그 결과는 다음과 같은 오류가 발생합니다.

오류 C2912은 : 명시 적 전문성 '무효 DataClass :: WriteData2 (직렬화 :: 개체 *, INT)는' 내 질문은 어떻게하고,

그래서 함수 템플릿의 특수화되지 않습니다 직렬화 :: 객체에서 올바른 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가 templatized이기 때문에 원래 WriteData의 특수화가 필요했습니다. DataClass :: WriteData (Serialization :: Object * obj)와 제네릭 버전. 정말 고마워요! –