Template-Funktionsspezialisierung bereits definiert...



  • Hi,

    #ifndef TERMTREE_NODE_
    #define TERMTREE_NODE_
    
    #include "BNode.hpp"
    #include "Operators.hpp"
    #include "Leaf.hpp"
    #include "Termcalc.hpp"
    // Für Template-Spezialisierung
    #include "complex_ext.hpp"
    
    namespace Maths
    {
    	namespace TermTree
    	{
    		// Sowohl uni- bi und trinär verwendbar
    		template<class T>
    			class Node : public BNode<T>
    		{
    		private:
    			BNode<T>*   nextnode1_;
    			BNode<T>*   nextnode2_;
    
    			moperator op_;
    
    		protected:
    
    			T UseOperator() const;
    
    			void InsertNode1(Node<T>* nextnode1)
    			{
    				nextnode1_ = nextnode1;
    			}
    
    			void InsertNode2(Node<T>* nextnode2)
    			{
    				nextnode2_ = nextnode2;
    			}
    
    		public:
    			Node() : nextnode1_(0), nextnode2_(0) {}
    			Node(const string& term) : nextnode1_(0), nextnode2_(0)
    			{
    				InsertElaborate(term);
    			}
    
    			~Node()
    			{
    				delete nextnode1_;
    				nextnode1_ = 0;
    				delete nextnode2_;
    				nextnode2_ = 0;
    			}
    
    			virtual T GetValue() const {return UseOperator();}
    
    			void InsertElaborate(const string& term);
    		};
    
    		// =====================================================================================
    
    		template<class T>
    			T Node<T>::UseOperator() const
    		{
    ...
    		}
    
    		// =====================================================================================
    
    		template<class T>
    			void Node<T>::InsertElaborate(const string& term)
    		{
    ...
    	        }
    
    		// =====================================================================================
    
    		// Spezialisierungen
    
    		template<>
    		complex<long double> Node<complex<long double> >::UseOperator() const
    		{
    ...
    		} // Ende der Funktion	
    	}
    }
    
    #endif
    

    Irgendwas mache ich wohl falsch, denn er meldet mir:

    QXPMath.obj : warning LNK4006: "protected: struct _STL::complex<long double> __thiscall Maths::TermTree::Node<struct _STL::complex<long double> >::UseOperator(void)const " (?UseOperator@?Node@U?Node@U?complex@O@_STL@@@TermTree@Maths@@IBE?AU?$complex@O@_S
    TL@@XZ) bereits in main.obj definiert; zweite Definition wird ignoriert

    und

    QXPMath.obj : error LNK2005: "protected: struct _STL::complex<long double> __thiscall Maths::TermTree::Node<struct _STL::complex<long double> >::UseOperator(void)const " (?UseOperator@?Node@U?Node@U?complex@O@_STL@@@TermTree@Maths@@IBE?AU?$complex@O@_STL
    @@XZ) bereits in main.obj definiert

    Ich werde daraus nicht schlau und weiß nicht weiter. 😞

    Anzumerken ist vielleicht noch, dass ich die Header und Quellcodedateien einfach in einem anderen Projekt und Ordner verwende, als wo sie erstellt wurden.
    In dem Ausgangsprojekt klappt es seltsamerweise. 😞

    MfG Eisflamme



  • Wenn du UseOperator spezialisieren willst, muss das eine Template-Memberfunktion sein. Kann auch sein, dass du besser Node spezialisieren solltest. Kann auch sein, dass ich völligen Mist rede.



  • Aber ist es hiermit complex<long double> Node<complex<long double> >::UseOperator() const nicht eine Memberfunktion?



  • Hallo,
    eine vollständige Spezialisierung ist *kein* Template.

    template<>
    complex<long double> Node<complex<long double> >::UseOperator() const
    {
    } // Ende der
    

    Dies ist *keine* Templatefunktion sondern eine ganz normale Funktion. Demzufolge gelten für diese Funktion die ODR-Regeln normaler Funktionen. Sprich: Da diese Funktion nicht inline-deklariert ist, führt die Definition im Header zu ODR-Verletzungen, wenn der Header in mehr als eine ÜE inkludiert wird.


Anmelden zum Antworten