您的位置:首页 > 编程语言 > C语言/C++

c++类模板遇到的两则问题

2011-01-06 22:53 155 查看
情景前提:

将类模板的声明和实现分开,分别在头文件和源文件中,平台是vs2005.

第一个问题是关于类模板的基本知识问题,错误类型2039:

通过代码就能复习了,这里mark一下:

声明文件中的代码,文件名:gstack.h

template<class Type, int i> class gstack
{
public:
gstack();
int Initstack();
int DestoryStack();
int ClearStack();
int StackEmpty();
Type* Gettop();
int Push(Type& e);
Type* Pop();
int  StackTraverse();
void StackOutput();
~gstack(){
pos=0;
delete[] a;
a=NULL;
}
private:
int pos;
Type* a;
};


源文件中的代码如下:

#include "gstack.h"
template <class Type, int i>
gstack<Type,i>::gstack(){
pos=-1;
Initstack();
}
template <class Type, int i> int gstack<Type,i>::Initstack(){
a=new Type[i];
if (a==NULL)
return 0;
else return 1;
}
template <class Type, int i> int gstack<Type,i>::DestoryStack(){
delete[] a;
a=NULL;
pos=-1;
return 1;
}
template<class Type, int i> int gstack<Type,i>::StackTraverse(){
if (pos==0||(pos==-1))
{
return 1;
}
else if(pos>=0)
{
int n=(pos+1)/2;
for (int i=1;i<=n;i++)
{
Type tmp=*(a+i);
*(a+i)=*(a+pos+2-i);
*(a+pos+2-i)=tmp;
}
return 1;
}
else if (pos<0)
{
return 0;
}
}


第二个问题,在一个cpp文件中要用到模板,即对自己弄好的类模板进行实例化,但是碰到了链接错误LINK2019,纠结,可我明明定义了相关成员函数啊。其实在源文件中写类模板的成员函数之时就在想如何能保证声明文件中的模板参数和源文件中的模板参数一致,即名字应该一致吧。去掉声明文件的include,换成include相应的源文件,程序通过。

这个问题的解决有赖于你的IDE环境:

(1)在code::blocks里面,包含源文件可以通过,同时包含源文件和声明文件也可以通过

 (2)但是在linux和vs中,只能包含实现文件,或者你把类模板的声明和实现放一块即放在声明文件中,这样就只需要包含声明文件就好啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: