template模板二

来源:互联网 发布:淘宝网浅秋女羊毛衫 编辑:程序博客网 时间:2024/05/20 20:03

二、类模板通式


  1、类模板的格式为:

    template<class  形参名class 形参名>   class 类名

    { ... };

  类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。比如

    template<class T> class A{public: T a; T b; T hy(T c, T &d);};

在类A中声明了两个类型为T的成员变量ab,还声明了一个返回类型为T带两个参数类型为T的函数hy

  2、类模板对象的创建:比如一个模板类A,则使用类模板创建对象的方法为A<int> m;在类A后面跟上一个<>尖括号并在里面填上相应的类型,这样的话类A中凡是用到模板形参的地方都会被int 所代替。当类模板有两个模板形参时创建对象的方法为A<int, double> m;类型之间用逗号隔开。

  3、对于类模板,模板形参的类型必须在类名后的尖括号中明确指定。比如A<2> m;用这种方法把模板形参设置为int是错误的(编译错误:error C2079: 'a' uses undefined class 'A<int>'),类模板形参不存在实参推演的问题。也就是说不能把整型值2推演为int 型传递给模板形参。要把类模板形参调置为int 型必须这样指定A<int> m

  4、在类模板外部定义成员函数的方法为:

    template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},

比如有两个模板形参T1T2的类A中含有一个void h()函数,则定义该函数的语法为:

    template<class T1,class T2> void A<T1,T2>::h(){}。

注意:当在类外面定义类的成员时template后面的模板形参应与要定义的类的模板形参一致。

  5、再次提醒注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

#include <QCoreApplication>#include <QDebug>template<typename T> class A{public: T a; T b; T add(T c, T d)    {    return c+d;    }};template<typename T1,typename T2> class B{public: T1 a; T2 b; T1 add(T1 c, T2 d)    {    return c+d;    }};int main(int argc, char *argv[]){    A<int> s;    B<int,double> m;    int a = 8;    double b = 6;    double c = 6;    qDebug()<<s.add(b,c);    qDebug()<<m.add(a,c);    return 0;}

运行结果:











原创粉丝点击