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@H@fa@@QAEAAV01@ABV?XY@H@fa@@QAEAAV01@ABV?XY@N@1@@Z) bereits in Main.obj definiert
    Debug/Konsole.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden

    Hier 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);
    	}
    }
    
    #endif
    

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


Anmelden zum Antworten