您现在的位置:学赛首页 > 计算机等级考试 > 复习资料 > 正文
二级C++重点难点分析:模板[4]
http://www.educity.cn 作者:希赛IT教育研发中心 来源:希赛网 2007年7月11日 发表评论 进入社区
    int和double型,这将导致编译器无法找到匹配的函数模板的定义,编译时报错。解决这一问题的方法之一就是显示给出虚拟类型参数T对应的模板实参,强制T对应于int或是double。
    ② 虚拟类型参数用做函数的返回值类型,而且函数需要返回特定类型的值,而不管函数实参的类型是什么。在这种情况下,需要用模板实参强制虚拟类型参数对应于特定类型。
    ③ 虚拟类型参数没有出现在模板的“函数形参表”中。此时无法从模板的“函数实参表”中获取对应的信息,因而不能省略模板实参。
    ④ 函数模板含有常规形参。常规参数是用具体的类型修饰符(如int、double、char*等)定义的,对应的实参必须是常量表达式。因此,常规参数的信息无法从模板的“函数实参表”中获得,调用模板函数时必须显示给出对应于常规参数的模板实参。

       例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

[1]  [2]  [3]  [4]