函数模板的实例化是由编译程序在处理函数调用时自动完成的,
而类模板的实例化必须由程序员在程序中显式地指定。
1、函数模板
声明
template <typename 类型参数>
返回类型 函数名(模板参数){函数体}
template <class 类型参数>
返回类型 函数名(模板参数){函数体}
使用
函数名(模板实参表)
模板函数可以重载
函数模板与同名的非模板函数可以重载,但是先调用非模板的函数,再调用模板函数
#include <iostream>
using namespace std;
template <typename p1,typename p2>
void two_p(p1 x,p2 y){
cout<<x<<" "<<y<<endl;
}
int main()
{
two_p(56,"zhang");
two_p(12.5,855);
return 0;
}
2、类模板
声明
template <typename 类型参数>
class 类名{类成员声明}
template <class 类型参数>
class 类名{类成员声明}
使用
类模板名 <实际类型名> 对象名
类模板名 <实际类型名> 对象名(实参表列)
函数类外定义
template <typename 类型函数>
函数类型 类名<类型参数>::成员函数名(形参表)
#include <iostream>
using namespace std;
template <typename T>
class Three{
public :
Three(T a,T b,T c);
T sum();
private:
T x,y,z;
};
template <typename T>
Three<T>::Three(T a,T b,T c){
x = a;
y = b;
z = c;
}
template <typename T>
T Three<T>::sum(){
return x+y+z;
}
int main(){
Three<int> sum3_1(3,5,7);
Three<double> sum3_2(3.1,5.2,7.5);
cout<<sum3_1.sum()<<endl;
cout<<sum3_2.sum()<<endl;
}