在学习数据结构的时候,老师让我们自己实现堆栈。我采用了模板类的方式,延续了以往写c++类时的习惯,我将模板的声明写在了h头文件之中,而将实现单独的写在了实现的cpp文件之中,可是当我在主函数之中调用模板类的函数时,出现了LINK2019错误
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 "public: bool __thiscall MyStack<int>::StackEmpty(class MyStack<int>)" (?StackEmpty@?$MyStack@H@@QAE_NV1@@Z),该符号在函数 _main 中被引用 Stock D:\C++学习\Stock\Stock\stack.obj 1
在调试了几个函数都出现了这样的问题,但是不使用函数只是声明变量却没报错,说明问题就是出现在cpp文件上,函数的具体实现没有链接到位。
经过查询资料发现,问题就是出现在我将声明与实现分离。模板类并不支持这么做。。。
解决方法如下:
1.添加实.cpp到主函数文件之中,即可通过。
2.将声明与实现写在一起。
最后附上我写的代码,希望能够得到指正!
#ifndef STOCK_H_INCLUDED
#define STOCK_H_INCLUDED
#define Status int
using namespace std;
template<typename T> class MyStack {
public:
MyStack();
Status InitStack(MyStack &S);//创建空栈
Status Destroy(MyStack &S);//销毁空栈
Status ClearStack(MyStack &S);//将至置为空栈
bool StackEmpty(MyStack S);//判断栈是否为空
int StackLength(MyStack S);//返回栈的长度
Status GetTop(MyStack S,T &e);//返回栈顶元素
Status Push(MyStack &S,T e);//插入新元素作为栈顶元素
Status Pop(MyStack &S,T &e);//删除栈顶元素,如果为空栈,则返回错误
//Status StackTraverse(MyStack S, Status(*visit)());//对栈进行遍历,对每一个元素使用visit函数
T *base;//栈底
T *top;//栈顶
int stacksize;//栈长度
};
#endif // STOCK_H_INCLUDED
#include"stack.h"
template<typename T>
MyStack<T>::MyStack()
{
}
template <class T>
Status MyStack<T>::InitStack(MyStack &S)
{
S.base = new T[100];
if (!S.base)
return 0;//内存分配失败
else
{
S.stacksize = 0;
S.top = S.base;
return 1;
}//内存分配成功
}
template<typename T>
Status MyStack<T>::Destroy(MyStack & S)
{
if (free(S.base))
return 1;
else
return 0;
}
template<typename T>
Status MyStack<T>::ClearStack(MyStack & S)
{
if (S.base == S.top)
{
return 0;
}
else
{
while (S.base != S.top)
{
*S.top = 0;
S.top--;
}
return 1;
}
}
template<typename T>
bool MyStack<T>::StackEmpty(MyStack S)
{
if (S.base == S.top)
return false;//空栈返回false
else
return true;//有元素则返回true
}
template<typename T>
int MyStack<T>::StackLength(MyStack S)
{
return S.stacksize;
}
template<typename T>
Status MyStack<T>::GetTop(MyStack S,T &e)
{
if (S.base == S.top)
return 0;
else
{
e = *S.top;
return 1;
}
}
template<typename T>
Status MyStack<T>::Push(MyStack &S,T e)
{
if ((S.stacksize >= 100))
{
cout << "栈已满" << endl;
return 0;
}
else
{
*S.top = e;
S.top++;
S.stacksize++;
}
return 1;
}
template<typename T>
Status MyStack<T>::Pop(MyStack & S,T &e)
{
if (S.base == S.top)
{
cout << "空栈,无法删除" << endl;
return 0;
}
else
{
e = *S.top;
free(S.top);
S.top--;
S.stacksize--;
}
return 1;
}
更新以下!经过代码调试的时候发现尽管在vs2015可以通过编译,但是事实上cpp中的代码并没有得到实现!如果在code blocks中,则无法通过编译!
所以将cpp包含进去的方法,不可行!!!
必须将实现一并写在头文件之中才可以得到实现哦!