问题的提出

image.png

类模板的定义

  1. template <class 类型参数1 class 类型参数2, ...> // 类型参数表
  2. class 类模板名 {
  3. 成员函数和成员变量
  4. };

成员函数的写法

  1. template <typename 类型参数1, class 类型参数2, ...> // 类型参数表
  2. 返回值类型 类模板名<类型参数名列表>::成员函数名(参数表) {
  3. ...
  4. }

定义对象的写法

  1. 类模板名 <真实类型参数表> 对象名(构造函数实参表)

模板类示例:Pair类模板

  1. template <class T1, class T2>
  2. class Pair {
  3. public:
  4. T1 key;
  5. T2 value;
  6. Pair(T1 k, T2 v):key(k), vaule(v) {}
  7. bool operator < (const Pair<T1, T2> & p) const;
  8. }
  9. template<class T1, class T2>
  10. bool Pair<T1, T2>::operator < (const Pair<T1, T2> & p) const {
  11. return key < p.key;
  12. }
  13. void main() {
  14. Pair<string, int> student("Tom", 19);
  15. // 实例化出一个类 Pair<string, int>
  16. cout << student.key << " " << student.value;
  17. }

用类模板定义对象

编译器由类模板生成类的过程交类模板的实例化。由类模板实例化得到的类,叫模板类

  • 同一个类模板的两个模板类是不兼容的
    1. Pair<string, int > * p;
    2. Pair<string, double> a;
    3. p = & a; // wrong

    函数模板作为类模板的成员

    1. #include <iostream>
    2. using namespace std;
    3. template <class T>
    4. class A {
    5. public:
    6. template<class T2>
    7. void Func(T2 t) { cout << t; } // 成员函数模板
    8. }
    9. void main() {
    10. A<int> a;
    11. a.Func('K'); // 成员函数模板 Func被实例化
    12. a.Func("hell"); // 成员函数模板 Func被再次实例化
    13. } // 输出 KHello

    类模板与非类型参数

    1. template <class T, int size>
    2. class CArray {
    3. T array[size];
    4. public:
    5. void Print() {
    6. for(int i = 0; i < size; ++i)
    7. cout << array[i] << endl;
    8. }
    9. };
    10. CArray<double 40> a2;
    11. CArray<int 50> a3;