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@?complex@O@_STL@@@TermTree@Maths@@IBE?AU?$complex@O@_S
TL@@XZ) bereits in main.obj definiert; zweite Definition wird ignoriertund
QXPMath.obj : error LNK2005: "protected: struct _STL::complex<long double> __thiscall Maths::TermTree::Node<struct _STL::complex<long double> >::UseOperator(void)const " (?UseOperator@?complex@O@_STL@@@TermTree@Maths@@IBE?AU?$complex@O@_STL
@@XZ) bereits in main.obj definiertIch 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.