2017-09-24 2 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 weiß, wie bestimmte Arten zu schreiben: uint64, double, String. Seine generische <T> Implementierung wird nicht mit einer statischen_Ausführung implementiert.C++ Template-Spezialisierung. Wie können Sie einen bestimmten Typ auswählen?

Das Problem ist, wenn MyType ist int es die generische Implementierung wählt. Ich möchte, dass es die uint64 Version wählt. Ich habe versucht, eine Spezialisierung auf DataClass hinzuzufügen, aber es zieht immer noch die generische Implementierung vor. <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); 
} 

Bitte beachte, dass ich verschiedene Kombinationen von Zeiger/Nicht-Zeiger Anrufe versucht haben, also denke ich nicht, dass das Problem ist. Ich versuchte, die template <> leer zu lassen, wie Sie in anderen Spezialisierungen tun, und das führt zu dem folgenden Fehler.

Fehler C2912: explizite Spezialisierung 'Leere Dataclass :: WriteData2 (Serialisierung :: Object *, int)' ist nicht eine Spezialisierung einer Funktion Vorlage

Also, meine Frage ist, wie zu tun Ich bekomme es die richtige uint64 Funktion auf Serialization :: Object zu wählen? Ich könnte nur eine int-Version auf Serialization :: Object implementieren, aber ich möchte keine Spezialisierung für jeden möglichen Typ schreiben.

+0

Die Fehlermeldung zeigt an etwas ganz anderes, als Sie vermuten, dass es funktioniert. Nichts mit 'Serialization :: Object' zu tun. – user0042

Antwort

0

Versuch von außerhalb der Klasse folgende:

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

Ah! Sehr nah. Weil DataClass templated ist, brauchte es nur die Spezialisierung für die ursprünglichen WriteData. Dataclass :: Writedata (Serialisierung :: Object * obj) und die generische Version. Vielen Dank! –

Verwandte Themen