Spezialisierung von Template Funktionen in einer Template Klasse



  • Hallo zusammen,

    ich verstehe warscheinlich noch nicht warum meine Implementierung Fehler verursacht, aber ich hoffe ich kann hier erleuchtet werden.

    Folgendes Problem

    template <class device_class>
    class Messages {
       template<typename T> void DefaultFormat(T nVarValue, CString& sVarValue);
       template <> void DefaultFormat<INT16>(INT16 nVarValue, CString& sVarValue) {...} //das geht
       template <> void DefaultFormat<UINT16>(UINT16 nVarValue, CString& sVarValue) {...} //das geht nicht
    
    };
    
    //das geht auch
    template <class device_class> template <typename T>
    void Messages<device_class>::DefaultFormat(T nVarValue, CString& sVarValue) {...}
    
    //das geht dann nicht mehr C2768 + C2244
    template <class device_class> template <>
    void Messages<device_class>::DefaultFormat<UINT16>(UINT16 nVarValue, CString& sVarValue) {...}
    
    //das geht dann nicht mehr C2768 + C2244
    template <class device_class> template <>
    void Messages<device_class>::DefaultFormat<UINT32>(UINT32 nVarValue, CString& sVarValue) {...}
    

    Ich will die Spezialsierungen der Funktionen aber eigentlich nicht in der Klassendeklaration machen...

    Compiler ist VC2003

    MfG
    Klaus



  • Ob das jetzt geht oder nicht, weiß ich gar nicht. Ich würde versuchen, Spezialisierungen von Funktionstemplates ganz sein zu lassen. Man kann das auch immer anders aufschreiben/designen (und das ist dann oft auch eleganter).



  • Bevor jemand auf das Problem eingeht: Gibt es einen Grund warum du keine Überladungen für UINT16 und UINT32 machst? Grundsätzlich sollten Überladungen Spezialisierungen vorgezogen werden.



  • Hallo zusammen,

    ihr habt Recht ich brauche die Templates an der Stelle nicht.
    Ich würde nur gern verstehen warum die Speialiserung außerhalb der Klassendefinition so nicht geht.

    die Varianten die auch außerhalb der Klassendeklaration funktionieren sind folgende:

    template <class device_class> template <typename T>
    template <> template <typename T>
    template <> template <>
    

    was offensichtlich nicht geht ist:

    template <class device_class> template <>
    

    die Spezialisierungen müssen immer von vorne beginnen?

    Gruss
    Klaus


Anmelden zum Antworten