您的位置:首页 > 其它

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

2012-04-22 14:13 411 查看
今天实现了一个优先级队列,经过调试,模版实现必须和声明在同一个文件中:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: