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
-
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.