为什么出现error C2953: “LinkNode”: 类模板已经定义

这是课本上实现链接栈的头文件,但是使用时出现了类模板已经定义的错误,有时候没有,请问什么情况下会出现这样的错误,编程软件是vs2019

#ifndef LINKSTACK
#define LINKSTACK
#include<iostream>
using namespace std;
//存储结点类
template<class T>
class LinkNode    //结点类
{
	template<class T>
	friend class LinkStack;			//将链接栈类声明为友类
public:
	LinkNode()//构造函数
	{
		next = NULL;
	}
private:
	T data;					//结点元素
	LinkNode<T>* next;		//指向下一个结点的指针
};
//单向链接栈类
template<class T>
class LinkStack
{
public:
	LinkStack();				//构造函数,创建空栈
	~LinkStack();				//析构函数,删除栈
	bool IsEmpty() const;
	//判断栈是否为空,空返回true,非空返回false
	bool Push(const T& x);
	//在栈顶插入元素x,插入成功返回true,不成功返回false
	bool Top(T& x);
	//求栈顶元素的值放入x中,成功返回true,失败返回false
	bool Pop(T& x);
	//从栈顶删除一个元素,并将该元素的值放入x中
	void OutPut(ostream& out) const;	// 将顺序栈放到输出流out中输出
private:
	LinkNode<T>* top;			//指向链接栈的栈顶结点的指针
	int size;					//栈中元素个数
};
//实现构造函数
template<class T>
LinkStack<T>::LinkStack()
{
	top = NULL;
	size = 0;
}
//实现析构函数
template<class T>
LinkStack<T>::~LinkStack()
{
	T x;
	while (top != NULL)		//栈非空则元素依次出栈
		Pop(x);
}
//实现判断栈是否为空
template<class T>
bool LinkStack<T>::IsEmpty() const
{
	return top == NULL;
}
//实现进栈
template<class T>
bool LinkStack<T>::Push(const T& x)
{
	LinkNode<T>* p = new LinkNode<T>;
	if (p == NULL)
		return false;
	else
	{
		p->data = x;				//为元素赋值
		p->next = top;			//将新节点插入栈顶
		top = p;					//top指向栈顶
		size++;
		return true;
	}
}
//实现求栈顶元素
template<class T>
bool LinkStack<T>::Top(T& x)
{
	if (IsEmpty())
		return false;
	else
	{
		x = top->data;
		return true;
	}
}
//实现出栈
template<class T>
bool LinkStack<T>::Pop(T& x)
{
	LinkNode<T>* p;
	if (IsEmpty())
		return false;
	else
	{
		x = top->data;			//删除元素的值放入x中
		p = top;					//得到待删除节点的指针
		top = top->next;			//top指向新的栈顶
		delete p;				//元素出栈
		size--;
		return true;
	}
}
//实现链接栈的输出
template<class T>
void LinkStack<T>::OutPut(ostream& out) const
{
	LinkNode<T>* p;
	p = top;
	for (int i = 0; i < size; i++)
	{
		out << p->data;
		p = p->next;
	}
}
//重载插入运算符<<
template<class T>
ostream& operator<<(ostream& out, const LinkStack<T>& x)
{
	x.OutPut(out);
	return out;
}
#endif

 

在文件头文件中,不能重复包含.h文件,比如我在一个二叉树头文件包含了队列的头文件例如: 在BinaryTree.h中 #include“Queue.h",这样就会报错说node类模板已经定义,或者你直接在头文件添加#ifdefine来实现,避免重复定义!调了半天才知道,网上查的大多对我这个问题无效