模板在没有实例化之前是无法编译的,因为没有使用类型实例化的模板是不能生成代码的。所以一般处理模板的方法是,将模板的声明和定义都放到一个.h文件之中,或者使用export关键字,但是后者在很多C++编译器实现(如:VC)中不被支持.
如果说硬要把声明和定义分开来写的,也是可以的,不过用起来就不好了!例如,要做一个Stack,会在main中调用Stack<int> s;这样的语句,那么就必须在Stack.cpp文件的后面加上一句template class Stack<int>;
1 template <class T>
2 class Stack
3 {
4 public:
5 Stack();
6 ~Stack();
7 public:
8 void pop();
9 //
10 };
1 #include "Stack.h"
2
3 template <class T>
4 Stack<T>::Stack(void)
5 {}
6
7 template <class T>
8 Stack<T>::~Stack(void)
9 {}
10
11 template <class t>
12 void Stack<T>::pop()
13 {
14 //
15 }
16
17 template class Stack<int>;
可以看出,用户要用其它类型的Stack的话就必须在Stack.cpp文件中加入具体的类型.不然就会出现类似这样的错误提示:
error LNK2019: 无法解析的外部符号 "public: __thiscall Stack<int>::~Stack<int>(void)" (??1?$Stack@H@@QAE@XZ),该符号在函数 _main 中被引用
所以,还是所声明与定义都会在.h文件中吧.