在调用模板函数时,编译系统依据实际所使用的数据类型生成某个具体函数定义的过程称为函数模板的实例化。在实例化过程中,是用实际类型(如int、long等)替代虚拟类型的。
实例化的过程或结果通常是看不见的,编译系统会根据函数调用的具体情况自动传递相应的模板实参,生成相应的函数实例。每一个实例就是一个函数定义。
实例化过程中,除了可以用各种具体的C++固有数据类型取代虚拟类型,还可以用某些用户自定义类型来取代虚拟类型,这里的自定义类型包括结构体以及某些用户定义的类。
例14.1.4 下列程序的输出结果是 。[2004年9月 填空第13题]
#include <iostream>
using namespace std;
template <typename T>
T fun (T a, T b) {return (a<=b)?a:b;}
int main()
{
cout<<fun(3,6)<<','<<fun(3.14F,6.28F)<<endl;
return 0;
}
解析:本题定义了一个模板函数fun,其形参a、b及函数返回类型均为T类型。函数fun的功能是返回a、b中数值较小的数。在main函数中,第一次调用fun时,实际上是调用了“int fun(int a,int b)”这个函数,故返回整型数据“3”。第二次调用时,实际上是调用了函数“float fun (float a, float b)”,返回浮点型数据“3.14”。
答案:3,3.14
14.1.4 考点4:模板实参的省略
在调用模板函数时,编译系统需要足够的信息来判别每个虚拟类型参数所对应的实际类型,可以从两个不同的渠道获得信息:从“模板实参表”(在“<”和“>”之间)或从模板“函数实参表”(在“(”和“)”之间),“模板实参表”的信息优先于“函数实参表”的信息。如果从后者得到的信息已经能够判断其中部分或全部虚拟类型参数所对应的实际类型,而且它们又正好是“模板形参表声明”中最后的若干参数,则在“模板实参表”中可以省略这几个参数。如果所有的模板实参都被省略了,则空表“<>”也可以省略。
但在以下情况中,模板实参是不能省略的。
① 从模板“函数实参表”中获得的信息有矛盾。例如,当编译系统从某一个函数实参中获得的信息是虚拟类型参数T(假设为T)对应的实际类型为int,可是从另一个函数实参中获得的信息却是虚拟类型参数T对应的实际类型为double时,就产生了矛盾。T不可能同时为
本章节内容来自希赛全国计算机等级考试用书《计算机等级考试考点分析、题解与模拟——二级C++语言》。(购书请见 :http://shop.csai.cn/itbook/itbookinfo.asp?lbbh=10032460)