第七章 C++模板4237.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
函数模板名字空间 如果在全局域中声明了与模板参数同名的对象函数或类型则该全局名将被隐藏在下面的例子中tmp 的类型不是double 是模板参数Type typedef double Type; template class Type Type min( Type a, Type b ) { // tmp 类型为模板参数 Type // 不是全局 typedef Type tmp = a b ? a : b; return tmp; } 函数模板名字冲突 模板参数名在同一模板参数表中只能被使用一次,但是模板参数名可以在多个函数模板声明或定义之间被重复使用 // 错误: 模板参数名 Type 的非法重复使用 template class Type, class Type Type min( Type, Type ); ? // ok: 名字 Type 在不同模板之间重复使用 template class Type Type min( Type, Type ); template class Type Type max( Type, Type ); 函数模板名字冲突 在函数模板定义中声明的对象或类型不能与模板参数同名 template class Type Type min( Type a, Type b ) { // 错误: 重新声明模板参数 Type typedef double Type; Type tmp = a b ? a : b; return tmp; } 函数模板参数作为返回值 模板类型参数名可以被用做函数模板的返回值 // ok: T1 表示 min() 的返回类型 // T2 和 T3 表示参数类型 template class T1, class T2, class T3 T1 min( T2, T3 ); 函数模板中的二义性 为了分析模板定义,编译器必须能够区分出是类型以及不是类型的表达式。对于编译器来说它并不总是能够区分出模板定义中的哪些表达式是类型。 template class Parm, class U Parm minus( Parm* array, U value ) { Parm::name * p; // Parm::name, name 是类型名还是Parm的成员? 这是一个 指针声明还是乘法乘法? } 编译器不知道name 是否为一个类型因为它只有在模板被实例化之后才能找到Parm 表示的类的定义。 为了让编译器能够分析模板定义,用户必须指示编译器哪些表达式是类型表达式。 告诉编译器一个表达式是类型表达式的机制是在表达式前加上关键字typename。 template class Parm, class U Parm minus( Parm* array, U value ) { typename Parm::name * p; // ok: 指针声明 } 关键字typename 也可以被用在模板参数表中以指示一个模板参数是一个类型。 函数模板的类型匹配 函数模板中的模板形参可实例化为各种类型,但当实例化模板形参的各模板实参之间不完全一致时,就可能发生错误 templatetypename T??????? void min(T x, T y) {??return (xy)?x:y;??} void func(int i, char j) { ???min(i, i); ???min(j, j); ???min(i, j); //错误 ???min(j, i); //错误 } 先遇到的实参i是整型的,编译器就将模板形参解释为整型,此后出现的模板实参j不能解释为整型而产生错误,此情况不支持隐含的类型转换功能 类型匹配的解决 ⑴采用强制类型转换,如将语句min(i, j);改写为min(i,int( j)); ⑵用非模板函数重载函数模板 templatetypename T??????? T min(T x, T y) {??return (xy)?x:y;??} int min(int,int){return (xy)?x:y;}//支持隐式类型转换 void func(int i, char j) { ???min(i, i); ???min(j, j); ???min(i, j); ???min(j, i); } 在参数的隐式类型转换中,重载函数比模板函数更强大。 模板函数支持的参数转换 函数的实参类型不一定要严格匹配相应函数参数的类型。 可支持以下转换: 类型参数 左值转换 – 左值到右值,数组到指针,函数到指针 限定转换 – const或 volatile 继承转换 – 子类转到基类的指针或引用

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档