• 转载:为什么类模版的声明和实现不能分开


     

    今天实现了一个优先级队列,经过调试,模版实现必须和声明在同一个文件中:

    复制代码
     1 template<class T>
     2 class Priqueque
     3 {
     4     private:
     5         int maxSize;
     6         int n;
     7         T* queque;
     8         void Swap(int i,int j)
     9         {
    10             T temp = queque[i];
    11             queque[i] = queque[j];
    12             queque[j] = temp;
    13         }
    14     public:
    15         Priqueque(int maxSize);//³õʼ»¯ÓÅÏȼ¶¶ÓÁÐ
    16         bool insert(T t);
    17         T extractMin();
    18 
    19 };
    20 template<class T> Priqueque<T>::Priqueque(int maxSize)
    21 {
    22     queque = new T[maxSize + 1];
    23     this->maxSize = maxSize;
    24     n = 0;
    25 }
    26 template<class T> bool Priqueque<T>::insert(T t)
    27 {
    28     if (n >= maxSize)
    29     {
    30         return false;
    31     }
    32     n++;
    33     queque[n] = t;
    34     for (int i = n,p = i/2;i > 1 && queque[i] < queque[p];i = p,p = i/2)
    35     {
    36         Swap(i,p);
    37     }
    38     return true;
    39 }
    40 template<class T> T Priqueque<T>::extractMin()
    41 {
    42     T ret_value = queque[1];
    43     queque[1] = queque[n];
    44     n--;
    45     int i = 1;
    46     int c = 2 * i;
    47     while(c <= n)
    48     {
    49         if ((c + 1 <= n) && (queque[c+1] < queque[c]))
    50         {
    51             c++;
    52         }
    53         if (queque[i] < queque[c])
    54         {
    55             break;
    56         }
    57         Swap(i,c);
    58         i = c;
    59         c = 2 * i;
    60     }
    61     return ret_value;
    62 }
    复制代码

      对模版的这种实现方法提示几点:

    1. 模版的声明和实现必须在同一个头文件中。原因后面分析

    2. 实现中每个成员函数前都要加 template<class T>模版声明,否则出现error C2065: 'T' : undeclared identifier类似错误

    3. 实现函数前的模版类要将参数带上,如 Priqueque<T>::

      那么问题来了,为什么模版类的实现不能分开写呢?

      因为在编译时模板并不能生成真正的二进制代码,而是在编译调用模板类或函数的CPP文件时才会去找对应的模板声明和实现,在这种情况下编译器是不知道实现模板类或函数的CPP文件的存在,所以它只能找到模板类或函数的声明而找不到实现,而只好创建一个符号寄希望于链接程序找地址。但模板类或函数的实现并不能被编译成二进制代码,结果链接程序找不到地址只好报错了。

      这里有篇好文章:http://www.cppblog.com/michaelgao/archive/2008/10/09/63571.html

  • 相关阅读:
    剑指offer:二维数组的查找
    安卓突击:绘制图像
    安卓突击:绘制图形和文本
    Android突击:定制控件
    Android突击:PanelLayout的实现
    POJ 1426 Find The Multiple
    POJ 2251 Dungeon Master
    event.target的认识
    JS延迟加载
    jquery中position 和offset的区别
  • 原文地址:https://www.cnblogs.com/Yogurshine/p/2831721.html
Copyright © 2020-2023  润新知