Probleme mit Linken; Include
-
Hallo zusammen,
ich habe ein kleines Problem, dass ich nicht lösen kann (außer wenn ich STACK.cpp in TSTACK.cpp inkludieren würde).
STACK.H template <class T> class STACK { public: STACK(); void push(T element); T pop(void); int size(void); ~STACK(); private: struct NODES { T data; NODES* next; }; NODES* Top; int count; };
STACK.CPP #include "stack.h" #define NIL 0 template <class T> STACK<T>::STACK() { Top = NIL; count = 0; } template <class T> void STACK<T>::push(T element) { NODES* node = new NODES; node->data = element; node->next = Top; Top = node; count++; } template <class T> T STACK<T>::pop(void) { if(count == 0) return -1; else { NODES* del = new NODES; del = Top; Top = del->next; T data = del->data; delete del; count--; return data; } } template <class T> int STACK<T>::size(void) { return count; } template <class T> STACK<T>::~STACK() { int i = 0; for(i; i < count; i++) pop(); }
TSTACK.CPP #include <iostream> #include "stack.h" using namespace std; int main(void) { STACK<int> s; s.push(5); cout << s.pop() << "\n"; return 0; }
Vom Linker erhalte ich immer den Fehler "undefined reference" zu den Klassenfunktionen.
Achso, bevor jemand fragt: g++ tstack.cpp stack.cpp
Hoffe, jemand kann mir helfen
Stefan.
-
Template-Funktionen kannst du nicht in eine eigene CPP auslagern (es gibt zwar 'export', aber das unterstützt fast kein Compiler).
Der Grund ist einfach: Der Compiler nimmt sich jede CPP einzeln vor und weiß deshalb nicht, welche Instanziierungen der Funktionen er erzeugen soll. In der STACK.CPP hat er den Quellcode der Funktionen, weiß aber nicht, welche Version gebraucht hat. In der TSTACK.CPP weiß er zwar, daß er die int-Version der Methoden braucht, hat aber keinen Quellcode dafür.
-
Alles klar.
Ich hab jetzt in der STACK.H ans ende #include "STACK.CPP" eingefügt.
Ich hoffe das verstößt jetzt nicht gegen irgendwelche Regeln der Sprache
-
Nur gegen die Regel, daß man CPP's normalerweise nicht #include'n sollte - aber das kannst du korrigieren, indem du die Methoden direkt inline definierst (oder die Datei in "STACK.IMP" umbenennst).