今天实现了一个优先级队列,经过调试,模版实现必须和声明在同一个文件中:
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