一、函数模板
1、定义:
代表了一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
2、格式:
template<typename/classT>//但是建议使用typename,避免和class类混淆
Template <类型1变量1, 类型2 变量2, ….. > 返回类型 函数名(形参表)
{
函数定义体;
}
3、作用域
typedef intT;
template <typenameT>
T Add(Tleft,Tright)
{
T value = 3.14;//此处的value为double类型,局部隐藏了typedef定义的全局T;
cout<< typeid(value).name() << endl;
return(left+right);
}//T的作用域在模板形参之后到模板声明或定义的末尾之间使用,遵循名字屏蔽规则。
T global ;此处的T是全局的typedef的 int T;
4、编译:
模板被一共被编译了两次:
第一阶段:实例化之前,检查模板代码本身,看看模板是否出现语法错误,如:忘记分号或者变量名拼错,并检查参数类型是否匹配,在此阶段,编译器只能检查部分的错误。
第二阶段:实例化期间,只有这个阶段才会发现类型相关的错误,例如:实例化类型不支持某些函数调用。
5、实例化:
template <typenameT>
T Add(T left, T right)
{
return(left+ right);
}
cout << Add('1', '2')<<endl;//c
cou