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

 

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

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

原文地址:https://www.cnblogs.com/Yogurshine/p/2831721.html