Fehlender Symbolfehler (undefinierte Referenz)
-
22-10-2019 - |
Frage
Ich habe versucht, eine Klasse DS mit der Erklärung in DS.H und der Implementierung bei DS.CPP zu definieren. Der Code ist sehr klein. Hier ist die Auflistung:
/*
* DS.h
*/
#ifndef DS_H_
#define DS_H_
#include "Node.h"
template<class T>
class DS
{
public:
static const int BST;
static const int SLL;
static const int DLL;
DS(const int);
~DS();
private:
int m_type;
Node<T> *head;
};
#endif /* DS_H_ */
Und,
/*
* DS.cpp
*/
#include "DS.h"
template<class T> const int DS<T>::BST = 0;
template<class T> const int DS<T>::SLL = 1;
template<class T> const int DS<T>::DLL = 2;
template<class T>
DS<T>::DS(const int type) :
m_type(type), head(0)
{
}
template<class T>
DS<T>::~DS()
{
}
Das Hauptprogramm ist:
#include "DS.h"
int main()
{
DS<int> *sll1 = new DS<int> (DS<int>::SLL);
delete sll1;
return 0;
}
Wenn ich versuche, dieses Programm zu kompilieren, erhalte ich den folgenden Fehler:
g++ -O2 -g -Wall -Wextra -Weffc++ -fmessage-length=0 -c -o Node.o Node.cpp
g++ -O2 -g -Wall -Wextra -Weffc++ -fmessage-length=0 -c -o DS.o DS.cpp
g++ -O2 -g -Wall -Wextra -Weffc++ -fmessage-length=0 -c -o main.o main.cpp
DS.h: In instantiation of ?DS<int>?:
main.cpp:13: instantiated from here
DS.h:15: warning: ?class DS<int>? has pointer data members
DS.h:15: warning: but does not override ?DS<int>(const DS<int>&)?
DS.h:15: warning: or ?operator=(const DS<int>&)?
g++ -o ds.exe Node.o DS.o main.o
main.o: In function `main':
/cygdrive/c/Documents and Settings/ansrivastava/My Documents/src/ds/main.cpp:13: undefined reference to `DS<int>::SLL'
/cygdrive/c/Documents and Settings/ansrivastava/My Documents/src/ds/main.cpp:13: undefined reference to `DS<int>::DS(int)'
/cygdrive/c/Documents and Settings/ansrivastava/My Documents/src/ds/main.cpp:14: undefined reference to `DS<int>::~DS()'
collect2: ld returned 1 exit status
make: *** [ds.exe] Error 1
Wenn ich nun den gesamten Code von DS.CPP entferne und in ds.h einfügt, kompiliert alles gut. Irgendeine Idee, was mache ich falsch?
Lösung
Now, if I remove all the code from DS.cpp and paste it into DS.h, everything compiles fine. Any idea what am I doing wrong?
Sehen Dieser Eintrag in der C ++ - FAQ über separate Zusammenstellung.
Andere Tipps
EIN static const
Das Wertmitglied muss initialisiert werden sofort, wie alle const
Wert. So:
static const int BST = 0;
static const int SLL = 1;
static const int DLL = 2;
Sie sagen sich selbst, dass es gut kompiliert, wenn Sie den Code von ds.cpp auf ds.h verschieben und fragen, was Sie falsch machen. Die Antwort ist genau das, Sie haben den Code in der .cpp -Datei. Wenn ds.cpp zusammengestellt wird
const int DS<int>::BST = 0;
const int DS<int>::SLL = 1;
const int DS<int>::DLL = 2;
wird zusammengestellt. Vergessen Sie nicht, dass DS nur eine Vorlage ist. Es bedeutet nichts zu kompilieren ds.cpp, da es nur die Vorlage enthält.