9.1.1.3 函数模板的使用
(1). 函数模板的基本使用
①T 为该模板的参数,在调用该模板函数时,必须用实际的数据类型进行实例化模板参数
T , 才能完成具体的函数功能。
例: 使用前例中的函数模板 “ template <class T> T max (T a, T b) ”
int a , b ;
char c , d ;
int m1= max (a ,b ) ; //调用 max(int a , int b )
char m2=max (c , d); //调用 max (char c ,char d )
模板参数 T 实例化为 int 型,函数模板 max 实例化后成为模板函数,能实现两个 int 型
类型数据的比较操作。对 char 同理 。
② 注意:在使用函数模板时,应保证函数的参数与模板函数的参数完全匹配,因为编译器
不会给模板函数的参数提供任何形式的转换。如果参数不合法,编译器给出出错信息。
例如:
int m3 = max ( a , c ) ; //编译出错,不能生成 max (int , char );这里不会利用隐式转
换规则将 c 转换为 int 类型。
(2). 函数模板与函数重载
定义一个函数模板与一个函数,它们都叫做 min,C++允许这种函数模板与函数同名的
所谓重载使用方法。但注意,在这种情况下,每当遇见函数调用时, C++编译器都将首先
检查是否存在重载函数,若匹配成功则调用该函数,否则再去匹配函数模板。
从函数模板产生的模板函数都是同名的,因此编译器可用重载的方法调用相应函数,
同时也可以象重载普通函数一样重载模板函数。
对于同名的模板函数与重载的非模板函数,编译器采用如下的顺序确定调用哪个函数
版本。
1)如果某一非模板函数的参数与函数调用的参数一致,则调用这个非模板函数;
2)如果从相应模板生成的模板函数中,有一个模板函数的参数与函数调用的参数一致,则
调用该模板函数;
3)对相应参数转换之后再匹配非模板函数。
4) 重载的非模板函数 int max ( int , int )使得模板 max 不能生成模板函数 int max (int , int ) ,
因为重载的非模板函数具有优先匹配权。
例上例:
假设另外增加一个非模板函数 int max ( int , int ) ,则有如下的调用方式:
int a , b ;
char c , d ;
int m1=max ( a , b) ; //调用重载的普通非模板函数 int max (int , int )
char m2= max (c , d) ; //调用函数模板生成的 char max ( char , char )
int m3=max (a , c ); //将 c 转换成 int 后调用重载的非模板函数 int max ( int , int )
(3). 二函数模板重载
定义两个函数模板,例如它们都叫做 sum,都使用了一个类型参数 Type,但两者的形