Template Spezialisierung -> Linker Problem
-
Hallo,
Folgende Template Klasse funktioniert, solange ich den Header nur in einer Quellcode Datei benutze. Sobald ich den Header in einer weiteren Datei einbinde kommt dieser Linker Fehler:
Test1.obj : error LNK2005: "public: class fa::XY<int> & __thiscall fa::XY<int>::operator=(class fa::XY<double> const &)" (??4?XY@N@1@@Z) bereits in Main.obj definiert
Debug/Konsole.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefundenHier nun mein Template:
#ifndef FAXY_H #define FAXY_H namespace fa { template <class T> class XY { public: XY(); XY( T nx, T ny ); XY( const XY<T> &other ); virtual ~XY(); XY<T> &operator=( const XY<int> &right ); XY<T> &operator=( const XY<double> &right ); T x,y; }; template <class T> XY<T>::XY() : x(0), y(0) { } template <class T> XY<T>::XY( T nx, T ny ) { x = nx; y = ny; } template <class T> XY<T>::XY( const XY<T> &other ) { (*this) = other; } template <class T> XY<T>::~XY() { } template <class T> XY<T> &XY<T>::operator=( const XY<int> &right ) { x = right.x; y = right.y; return (*this); } template <class T> XY<T> &XY<T>::operator=( const XY<double> &right ) { x = right.x; y = right.y; return (*this); } //Hier die Spezialisierung template <> XY<int> &XY<int>::operator=( const XY<double> &right ) { x = Util::Round( right.x, 0 ); y = Util::Round( right.y, 0 ); return (*this); } } #endifIch weiß echt nicht woran das liegt. Danke für jede Hilfe
Cappo
-
Hab die Suchfunktion entdeckt;)
Mit dem Schlüsselwort inline klappts...Juhu!
Cappo
-
Ich weiß echt nicht woran das liegt
Eine explizite Spezialisierung ist kein Template. Für eine explizite Spezialisierung einer Funktion gelten die selben ODR-spezifischen Regeln wie für eine normale Funktion. Sprich: sie darf nur einmal pro Programm nicht einmal pro Übersetzungseinheit definiert werden.
Lösung:
Entwder du implementierst die Spezialisierung in einer cpp-Datei oder du deklarierst die Funktion inline und implementierst sie im Header. So wie du es jetzt ja gemacht hast.