Frage zu Template-Spezialisierung



  • Hallo,

    ich hab u.a. folgendes in einer statischen Bib in einer Header-Datei stehen

    template<class T>
    T degreeToRad(T value)
    {
    	return value * PI / 180.0;
    }
    
    template<>
    float degreeToRad<float>(float value)
    {
    	return value * PI_f / 180.0f;
    }
    

    Nutze ich das Template in der Biliothek, dann gibt es eine Warnung, dass die Funktion mehrmals definiert ist, und die erste genutzt wird, alle anderen werden verworfen.

    Wenn ich dieses Template in einem anderen Projekt benuztze, was die Lib linkt, dann meckert der Linker, dass degreeToRad mehrmals definiert ist. Lasse ich die Spezialisierung weg, dann funktioniert alles.
    Hab ich da irgendetwas falsch gemacht mit der Spezialisierung? Oder ist das ein Fehler beim Compiler/Linker?



  • Hallo

    Das Template must du wie gewohnt komplett mit Implementierung weitergeben.
    Aber die Spezialisierung ist ja eine vollständige Funktion, und wird daher in die Library mit eingebunden. Damit must du aber auch nur den Prototyp der Spezialisierung exportieren, nicht die ganze Spezialiserung mit Implementation. So wie es bei anderen normalen Funktionen gemacht wird.

    bis bald
    akari


  • Mod

    Eine explizite (auch vollständige) Spezialisierung eines Templates ist kein Template. Eine Spezialisierung eines Funktionstemplates ist eine Funktion, folglich ist die ODR einzuhalten, so wie sie für Funktionen gilt: genau eine Definition im gesamten Programm. Alternativ könnte man diese Funktion inline deklarieren, dann sollten obige Probleme ebenfalls nicht auftreten.


Anmelden zum Antworten