为什么类模版的声明和实现不能分开
2012-04-22 14:13
411 查看
今天实现了一个优先级队列,经过调试,模版实现必须和声明在同一个文件中:
对模版的这种实现方法提示几点:
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
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文件中?
- 不能将类模板的声明与实现分开写
- 为什么C#的范型不能自动实现此接口
- 为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
- C++中模板不能把实现和声明放在两个不同的文件下
- 为什么构造函数不能声明为虚函数,析构函数可以
- typeloadexception 方法实现中引用的声明不能是final方法
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- 类模板不能让声明和实现分离
- 模板函数的声明和定义为何不能分开放在两个文件中?
- C++基础2 引用 函数扩展: 默认值 占位符 指针 重载 类:引用类指针 声明实现分开写
- 为什么构造函数不能声明为虚函数?
- C++: 为什么我们一般都要将函数的声明和定义分开?(separate the declaration of function from its definition)
- C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern "C"声明