以前没怎么用过模板,今天突然心血来潮想用模板来实现一个算法,搞了半天就不编译不成功。原来模板的实现与分离跟平时用到的不一样。因为在编译程序的时候需要知道参数T的具体类型,所以模板的实现不能与使用模板的程序分开编译,通常是把模板的定义和实现都写在同一个头文件里,现在有一个可替代的办法,就是在头文件的尾部包含实现文件,然后在使用模板的客户程序中包含头文件:
test.h
1 #ifndef _TEST_H_
2 #define _TEST_H_
3
4 template <class T>
5 class test {
6 public:
7 test(T v1, T v2);
8 test();
9
10 int compare() const;
11 private:
12 T _v1;
13 T _v2;
14 };
15
16 //此处包含实现文件
17 #include "test.cpp"
18
19 #endif
20
test.cpp
1 template<class T>
2 test<T>::test() : _v1(0),_v2(1) {
3
4 }
5
6 template<class T>
7 test<T>::test(T v1, T v2): _v1(v1),_v2(v2) {
8
9 }
10
11 template<class T>
12 int test<T>::compare() const {
13 return _v1>_v2?1:-1;
14 }
15
main.cpp
1 #include <iostream>
2 #include "test.h"
3
4 using namespace std;
5
6 int main() {
7 cout << "输入两个数" << endl;
8 int value1,value2;
9 cin >> value1 >> value2;
10 test<int> t(value1,value2);
11 cout << t.compare() <<endl;
12
13 return 1;
14 }
15
16
通过g++ main.cpp -o main编译成功。经过试验,这种方法支持类模板和函数模板。
其实在C++标准里有一个export关键字用来实现模板的定义与实现的分享的,但是到目前为止却找不到一款支持这个关键字的编译器,有点搞笑。