首先先说一下模板吧
template<class T>
T Min(T a,T b){}
其中T代表任意的数据类型,称为类属参数,先用函数模板来进行举例吧
#include<iostream>
using namespace std;
template<class T>
T Min(T a,T b)
{
return (a>b)?b:a;
}
int main()
{
double a=3.9,b=3.4;
int c=5,d=3;
cout<<"3.9与3.4最小值"<<Min(a,b)<<endl;
cout<<"5与3的最小值"<<Min(c,d)<<endl;
//cout<<"3.9与3的最小值"<<Min(a,d)<<endl;会发生编译错误。
cout<<"字符a与b的最小值"<<Min('a','b')<<endl;
return 0;
}
当你仅仅定义模板时,模板本身不能使编译器产生任何代码,因为编译器不知道你的函数模板到底要处理什么样的数据类型,在上例中当编译器遇到cout<<"3.9与3.4最小值"<<Min(a,b)<<endl;时才开始函数模板的实例化,因为这时可以告诉编译器我需要什么数据类型进行比较。
函数模板的定义:
template<class T1,class T2. . . . . >
返回类型 函数名 (参数表)
注意点
1,不要将类的声明关键字class与此处的class混淆,它们不一样,这里的class表示T类型是一种任意类型,当然你也可以写成template<typename T1,typename T2 . . . . .>以此来区分类的class。
2,不允许在template语句与函数模板定义之间有任何其它语句。
3,注意一下参数的匹配问题
如上例cout<<"3.9与3的最小值"<<Min(a,d)<<endl;会发生编译错误。因为这样会使编译器不知道要取int类型还是double类型
改法有三种
一,强制性类型转换cout<<"3.9与3的最小值"<<Min(a,(double)d)<<endl。
二,显式指定模板实例化的类型参数,这个是C++为用户提供的一种显式指定模板类型的方法,用法是:
cout<<"3.9与3的最小值"<<Min<double>(a,d)<<endl,即在函数名后加<参数实际类型>
三,指定多个模板参数,像下面代码所示
#include<iostream>
using namespace std;
template<class T1,class T2>
T1 Min(T1 a,T2 b)
{
return (a>b)?b:a;
}
int main()
{
double a=3.9;
int b=3;
cout<<"3.9与3的最小值"<<Min(a,b)<<endl;
return 0;
}
要注意返回类型要是两者中精度高的那一个。