例14.1.5 有如下函数模板定义:[2005年9月选择第25题]
template <class T>
T func (T x, T y){ return x*x+y*y;}
在下列对func的调用中,错误的是( )。
A.func(3,5); B.func(3.0,5.5); C.func(3,5.5); D.func<int>(3,5.5);
解析:对于本题中定义的模板函数,如果用选项C中“func(3,5.5);”的形式来调用,在编译时会出现“template parameter 'T' is ambiguous,could be 'double' or 'int' ”的错误,也就是说T对应的实际类型是不明确的。编译系统从第一个参数“3”获得的信息是“T对应于int”,而从第二个参数“5.5”处获得的信息是“T对应于double”,二者相互矛盾,因而编译时产生错误。
选项D中提供了模板实参<int>,因为模板实参优先于函数实参,所以T对应的实际类型是明确的,在这里就是int型。在调用过程中,double型的参数“5.5”将被自动转换成int型。
选型A和B所提供的两个函数实参的类型是一致的,不存在矛盾。
答案:C
例14.1.6 有如下函数模板声明:[2005年4月 选择第15题]
template <typename T>
T Max(T a,T b) {return (a>=b)?a:b;}
下列对函数模板Max的调用中错误的是( )。
A.Max(3.5,4.5) B.Max(3.5,4)
C.Max<double>(3.5,4.5) D.Max<double>(3.5,4)
答案:B
本章节内容来自希赛全国计算机等级考试用书《计算机等级考试考点分析、题解与模拟——二级C++语言》。(购书请见 :http://shop.csai.cn/itbook/itbookinfo.asp?lbbh=10032460)