我尝试使用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中,那么一切都很好。知道我做错了什么吗?
答案 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没有任何意义,因为它只包含模板。