转载:为什么类模版的声明和实现不能分开
2012-12-25 00:22
295 查看
今天实现了一个优先级队列,经过调试,模版实现必须和声明在同一个文件中:
template<class T> class Priqueque { private: int maxSize; int n; T* queque; void Swap(int i,int j) { T temp = queque[i]; queque[i] = queque[j]; queque[j] = temp; } public: Priqueque(int maxSize);//³õʼ»¯ÓÅÏȼ¶¶ÓÁÐ bool insert(T t); T extractMin(); }; template<class T> Priqueque<T>::Priqueque(int maxSize) { queque = new T[maxSize + 1]; this->maxSize = maxSize; n = 0; } template<class T> bool Priqueque<T>::insert(T t) { if (n >= maxSize) { return false; } n++; queque = t; for (int i = n,p = i/2;i > 1 && queque[i] < queque[p];i = p,p = i/2) { Swap(i,p); } return true; } template<class T> T Priqueque<T>::extractMin() { T ret_value = queque[1]; queque[1] = queque ; n--; int i = 1; int c = 2 * i; while(c <= n) { if ((c + 1 <= n) && (queque[c+1] < queque[c])) { c++; } if (queque[i] < queque[c]) { break; } Swap(i,c); i = c; c = 2 * i; } return ret_value; }
对模版的这种实现方法提示几点:
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
相关文章推荐
- 为什么类模版的声明和实现不能分开
- 为什么不能将类模板的声明与类模板函数实现分开写
- 为什么不能将类模板的声明与类模板函数实现分开写?
- 为什么不能将类模板的声明与类模板函数实现分开写
- C++模板声明和实现为什么不能分开来写
- 为什么不能将类模板的声明与类模板函数实现分开写
- 不能将类模板的声明与实现分开写
- 为什么不能分开模板的声明和定义,把定义放到.cpp文件中?
- windows为什么不能实现用户切换了或 win+L 不能锁定机算机 解决办法
- C++中模板不能把实现和声明放在两个不同的文件下
- 哪位高手帮我看看,为什么不能实现跳转到下一页或者上一页
- C头文件声明和实现分开
- java中的接口为什么可以多继承,而其他类则不能实现多继承
- 为什么php的trait不能实现interface
- 为什么不能实现网络共享
- 声明和实现,是分开好?还是放在一起好?
- 一个简单的安卓socket程序为什么不能实现
- 在知乎复制的文本为什么会自带一些版权声明,这个功能是如何实现的?
- Handler为什么不能实现进程间通讯
- 为什么不能用速度与时间的关系去实现动画