缺少符号错误(未定义的引用)

时间:2011-04-27 09:55:58

标签: c++ templates linker-errors undefined-reference

我尝试使用DS.h中的声明和DS.cpp中的实现来定义类DS 代码非常小,所以这里是列表:

 /*
  * 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 个答案:

答案 0 :(得分:3)

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中有关单独编译的this entry

答案 1 :(得分:0)

static const值成员必须以任何const值初始化立即。所以:

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

答案 2 :(得分:0)

如果您将代码从DS.cpp移动到DS.h并询问您做错了什么,那么您自己说它编译得很好。答案就是这样,你有.cpp文件中的代码。当编译DS.cpp时,它不会定义DS&lt; int&gt;因为这是在你的主文件中完成的,所以需要包含DS.h

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

将被编译。别忘了DS只是一个模板。它对编译DS.cpp没有任何意义,因为它只包含模板。