I have trying to define a class DS with the declaration in DS.h and implementation at DS.cpp The code is very small so here is the listing:
/*
* DS.h
*/
#ifndef DS_H_
#define DS_H_
#include "Node.h"
template<class T>
class DS
{
publ开发者_开发知识库ic:
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_ */
And,
/*
* 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()
{
}
The main program is:
#include "DS.h"
int main()
{
DS<int> *sll1 = new DS<int> (DS<int>::SLL);
delete sll1;
return 0;
}
When I try to compile this program, I get the following error:
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
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?
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?
See this entry in the C++ FAQ about separate compilation.
A static const
value member must be initialized immediately, as any const
value. So:
static const int BST = 0;
static const int SLL = 1;
static const int DLL = 2;
You are saying yourself that it compiles fine if you move the code from DS.cpp to DS.h and asking what you are doing wrong. The answer is just that, you have the code in the .cpp file. When DS.cpp is compiled it will not define DS < int > since this is done in your main file, therefore DS.h needs to be included so
const int DS<int>::BST = 0;
const int DS<int>::SLL = 1;
const int DS<int>::DLL = 2;
will be compiled. Dont forget that DS is just a template. It means nothing to compile DS.cpp since it only contains the template.
精彩评论