类模板语法知识注意事项

一、所有的类模板函数写在类的内部和写在类的外部,在一个cpp中

1.构造函数,没有问题;

2.普通函数,没有问题;

3.友元函数:用友元函数重载 << >>

     friend ostream& operator<< <T> (ostream &out, Complex<T> &c3) ;

 友元函数:友元函数不是实现函数重载(非 << >>)

              1)需要在类前增加 类的前置声明 函数的前置声明

                      template<typename T>

      class Complex; 

      template<typename T>

      Complex<T> mySub(Complex<T> &c1, Complex<T> &c2);

               2)类的内部声明 必须写成:

      friend Complex<T> mySub <T> (Complex<T> &c1, Complex<T> &c2);

               3)友元函数实现 必须写成:

                       template<typename T>

               Complex<T> mySub(Complex<T> &c1, Complex<T> &c2)

      {

               Complex<T> tmp(c1.a - c2.a, c1.b-c2.b);

                    return tmp;

      }

             4)友元函数调用 必须写成

                            Complex<int> c4 = mySub<int>(c1, c2);

                 cout<<c4;

结论:友元函数只用来进行左移、右移操作符重载。

 

二、所有的类模板函数写在类的外部,在不同的.h和.cpp中,

也就是类模板函数说明和类模板实现分开

类模板函数

  构造函数

  普通成员函数

  友元函数

    用友元函数重载<<>>;

    用友元函数重载非<< >>

                   要包含.cpp

总结:

归纳以上的介绍,可以这样声明和使用类模板:

1) 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。

2) 将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如上例中的numtype)。

3) 在类声明前面加入一行,格式为:

    template <class 虚拟类型参数>

如:

    template <class numtype> //注意本行末尾无分号

    class Compare

    {…}; //类体

4) 用类模板定义对象时用以下形式:

    类模板名<实际类型名> 对象名;

    类模板名<实际类型名> 对象名(实参表列);

如:

    Compare<int> cmp;

    Compare<int> cmp(3,7);

5) 如果在类模板外定义成员函数,应写成类模板形式:

   template <class 虚拟类型参数>

   函数类型 类模板名<虚拟类型参数>::成员函数名(函数形参表列) {…}

关于类模板的几点说明:

1) 类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如:

    template <class T1,class T2>

    class someclass

    {…};

在定义对象时分别代入实际的类型名,如:

    someclass<int,double> obj;

2) 和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对象。

3) 模板可以有层次,一个类模板可以作为基类,派生出派生模板类。

原文地址:https://www.cnblogs.com/gd-luojialin/p/9750240.html