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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top