C++模板4237幻灯片.pptVIP

  • 4
  • 0
  • 约7.15千字
  • 约 40页
  • 2016-12-05 发布于浙江
  • 举报
函数模板名字空间 如果在全局域中声明了与模板参数同名的对象函数或类型则该全局名将被隐藏在下面的例子中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)

1亿VIP精品文档

相关文档