Ошибка отсутствующего символа (неопределенная ссылка) - PullRequest
0 голосов
/ 27 апреля 2011

Я пытаюсь определить класс DS с объявлением в DS.h и реализацией в DS.cpp. Код очень маленький, поэтому вот список:

 /*
  * 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_ */

И,

 /*
  * 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()
 {
 }

Основная программа:

 #include "DS.h"

 int main()
 {
     DS<int> *sll1 = new DS<int> (DS<int>::SLL);
     delete sll1;
     return 0;
 }

Когда я пытаюсь скомпилировать эту программу, я получаю следующую ошибку:

 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

Теперь, если я удалю весь кодиз DS.cpp и вставьте его в DS.h, все прекрасно скомпилируется.Есть идеи, что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2011

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?

См. эту запись в C ++ FAQ о отдельной компиляции.

0 голосов
/ 27 апреля 2011

Вы говорите себе, что он хорошо компилируется, если вы перемещаете код из DS.cpp в DS.h, и спрашиваете, что вы делаете неправильно.Ответ прост: у вас есть код в файле .cpp.Когда DS.cpp компилируется, он не будет определять DS , поскольку это делается в вашем основном файле, поэтому необходимо включить DS.h, чтобы

const int DS<int>::BST = 0;
const int DS<int>::SLL = 1;
const int DS<int>::DLL = 2;

было скомпилировано.Не забывайте, что DS это просто шаблон.Это ничего не значит для компиляции DS.cpp, поскольку он содержит только шаблон.

0 голосов
/ 27 апреля 2011

Элемент static const значения должен быть инициализирован немедленно , как любое значение const. Итак:

     static const int BST = 0;
     static const int SLL = 1;
     static const int DLL = 2; 
...