写模板类时遇到的LNK2019问题

在学习数据结构的时候,老师让我们自己实现堆栈。我采用了模板类的方式,延续了以往写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包含进去的方法,不可行!!!

必须将实现一并写在头文件之中才可以得到实现哦!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

荆棘花王朝

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值