模板代码一律写在头文件中,不能写到cpp文件
原因链接
类模板的例子:
a.h
// 类模板
template <typename T1, typename T2>
class node
{
T1 a;
T2 b;
public:
node(){cout << "通用版本" << endl;}
};
// 类模板的特化1
template <typename T1>
class node<T1, string> // 特化模板需要增加一个参数列表
{
T1 a;
string b;
public:
node(){cout << "特化1" << endl;}
};
// 类模板的特化2
template <typename T2>
class node<string, T2> // 特化模板需要增加一个参数列表
{
string a;
T2 b;
public:
node(){cout << "特化2" << endl;}
};
// 类模板的全特化
template <>
class node<double, string> // 特化模板需要增加一个参数列表
{
double a;
string b;
public:
node(){cout << "全特化" << endl;}
};
b.h
// 模板代码一律写在头文件中,不能写到cpp文件
template <typename T>
class A
{
static int count;
T *p;
public:
A();
~A();
};
// 类的静态成员初始化
template <typename T>
int A<T>::count =0;
// 类模板的构造函数
template<typename T>
A<T>::A()
{
p = new T[100];
}
// 类模板的析构函数
template<typename T>
A<T>::~A()
{
delete [] p;
}
main.cpp代码:
#include <iostream>
using namespace std;
#include "b.h"
#include "a.h"
int main()
{
// node是模板
node<short, double> a;
// 当第二个参数的类型是string,特化1
node<int, string> b;
// 当第一个参数的类型是string,特化2
node<string, short> c;
// 当两个参数的类型依次是double,string,全特化
node<double, string> d;
A<int> x;
return 0;
}
函数模板的例子:
class Student
{
public:
int age;
Student(int a):age(a){}
};
// 函数模板: 函数生成器
// 函数模板在程序用到的时候才会实际产生一个具体的函数
template <typename T> // <类型参数列表>
T maxValue(T &a, T &b) // (数据参数列表)
{
return a>b ? a : b;
}
// 函数模板的特化
// 1,将特化了的类型参数,从模板中的类型参数列表剔除,但尖括号<>不能省
// 2,特化的函数模板的接口必须跟通用模板一致
template <> // <类型参数列表>
Student maxValue(Student &a, Student &b) // (数据参数列表)
{
if(a.age > b.age)
return a;
else
return b;
}
int main()
{
int a = 1, b = 2;
cout << maxValue(a, b) << endl;
float f1 = 1.1;
float f2 = 1.2;
cout << maxValue(f1, f2) << endl;
string s1 = "abc";
string s2 = "aBc";
cout << maxValue(s1, s2) << endl;
Student Jack(21);
Student Bill(28);
cout << maxValue(Jack, Bill).age << endl;
return 0;
}