zoukankan      html  css  js  c++  java
  • 转载:为什么类模版的声明和实现不能分开

     

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

    复制代码
     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

  • 相关阅读:
    URAL 1998 The old Padawan 二分
    URAL 1997 Those are not the droids you're looking for 二分图最大匹配
    URAL 1995 Illegal spices 贪心构造
    URAL 1993 This cheeseburger you don't need 模拟题
    URAL 1992 CVS
    URAL 1991 The battle near the swamp 水题
    Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力
    Codeforces Beta Round #7 D. Palindrome Degree hash
    Codeforces Beta Round #7 C. Line Exgcd
    Codeforces Beta Round #7 B. Memory Manager 模拟题
  • 原文地址:https://www.cnblogs.com/Yogurshine/p/2831721.html
Copyright © 2011-2022 走看看