关于栈的类定义问题

dfafe 2011-11-02 10:37:53
#include <iostream>
using namespace std;
#include <windows.h>
#include <assert.h>
template<class T>
struct LinkNode
{
T data;
LinkNode<T> *link;
LinkNode(LinkNode<T> *ptr=NULL){link=ptr;}
LinkNode(const T& item,LinkNode<T> *ptr=NULL)
{
data=item;
link=ptr;
}
};
template<class T>
class Stack
{
public:
Stack():top(NULL){}
~Stack() {makeEmpty();}
void Push(const T &x);
bool Pop(T &x);
bool getTop(T &x)const;
bool IsEmpty()const{return (top==NULL)?true:false;}
int getSize() const;
void makeEmpty();
friend ostream& operator << (ostream& os, const Stack<T> &s);
LinkNode<T> *top;

};
template<class T>
void Stack<T>::Push(const T &x)
{
top=new LinkNode<T>(x,top);
assert(top!=NULL);
};
template<class T>
bool Stack<T>::Pop(T &x)
{
if(IsEmpty()==true)return false;
LinkNode<T> *p=top;
top=top->link;
x=p->data;delete p;
return true;
};
template<class T>
bool Stack<T>::getTop(T &x) const
{
if(IsEmpty()==true) return false;
x=top->data;
return true;
};
template<class T>
int Stack<T>::getSize()const
{
LinkNode<T> *p=top;
int k=0;
while(p!=NULL)
{p=p->link;k++;}
return k;
};
template<class T>
void Stack<T>::makeEmpty()
{
LinkNode<T> *p;
while(top!=NULL)
{
p=top;
top=top->link;
delete p;
}
};
template<class T>
ostream& operator<< (ostream& os, const Stack<T> &s)
{
os << "栈中元素个数=" << s.getSize() << endl;
LinkNode<T> * p = s.top;
int i = 0;
while(p != NULL){
os << ++i << ":" << p -> data << endl;
if(p -> link == NULL)break;
p = p -> link;
}
return os;

}
这个为什么会出现错误,如下:
vs程序\lab3.1\lab3.1\linkedstack.h(16) : error C2953: “LinkNode”: 类模板已经定义
1> d:\vs程序\lab3.1\lab3.1\linkedstack.h(7) : 参见“LinkNode”的声明
1>d:\vs程序\lab3.1\lab3.1\linkedstack.h(32) : error C2953: “Stack”: 类模板已经定义
1> d:\vs程序\lab3.1\lab3.1\linkedstack.h(19) : 参见“Stack”的声明
1>d:\vs程序\lab3.1\lab3.1\linkedstack.h(38) : error C2244: “Stack<T>::Push”: 无法将函数定义与现有的声明匹配
1> d:\vs程序\lab3.1\lab3.1\linkedstack.h(23) : 参见“Stack<T>::Push”的声明
1> 定义
1> 'void Stack::Push(const T &)'
1> 现有声明
1> 'void Stack<T>::Push(const T &)'
1>d:\vs程序\lab3.1\lab3.1\linkedstack.h(47) : error C2244: “Stack<T>::Pop”: 无法将函数定义与现有的声明匹配
1> d:\vs程序\lab3.1\lab3.1\linkedstack.h(24) : 参见“Stack<T>::Pop”的声明
1> 定义
1> 'bool Stack::Pop(T &)'
1> 现有声明
1> 'bool Stack<T>::Pop(T &)'
1>d:\vs程序\lab3.1\lab3.1\linkedstack.h(54) : error C2244: “Stack<T>::getTop”: 无法将函数定义与现有的声明匹配
1> d:\vs程序\lab3.1\lab3.1\linkedstack.h(25) : 参见“Stack<T>::getTop”的声明
1> 定义
1> 'bool Stack::getTop(T &) const'
1> 现有声明
1> 'bool Stack<T>::getTop(T &) const'
1>d:\vs程序\lab3.1\lab3.1\linkedstack.h(63) : error C2244: “Stack<T>::getSize”: 无法将函数定义与现有的声明匹配
1> d:\vs程序\lab3.1\lab3.1\linkedstack.h(27) : 参见“Stack<T>::getSize”的声明
1> 定义
1> 'int Stack::getSize(void) const'
1> 现有声明
1> 'int Stack<T>::getSize(void) const'
1>d:\vs程序\lab3.1\lab3.1\linkedstack.h(74) : error C2244: “Stack<T>::makeEmpty”: 无法将函数定义与现有的声明匹配
1> d:\vs程序\lab3.1\lab3.1\linkedstack.h(28) : 参见“Stack<T>::makeEmpty”的声明
1> 定义
1> 'void Stack::makeEmpty(void)'
1> 现有声明
1> 'void Stack<T>::makeEmpty(void)'
1>d:\vs程序\lab3.1\lab3.1\calculator.h(8) : error C2512: “Stack”: 没有合适的默认构造函数可用
1>d:\vs程序\lab3.1\lab3.1\calculator.h(8) : error C2582: “operator =”函数在“Stack”中不可用
1>d:\vs程序\lab3.1\lab3.1\calculator.h(21) : warning C4805: “==”: 在操作中将类型“int”与类型“bool”混合不安全
1>d:\vs程序\lab3.1\lab3.1\calculator.h(25) : error C2662: “Stack<T>::Push”: 不能将“this”指针从“Stack”转换为“Stack<T> &”
1> 原因如下: 无法从“Stack”转换为“Stack<T>”
1> 转换要求第二个用户定义的转换运算符或构造函数
1>d:\vs程序\lab3.1\lab3.1\calculator.h(26) : error C2662: “Stack<T>::Push”: 不能将“this”指针从“Stack”转换为“Stack<T> &”
1> 原因如下: 无法从“Stack”转换为“Stack<T>”
1> 转换要求第二个用户定义的转换运算符或构造函数
1>d:\vs程序\lab3.1\lab3.1\calculator.h(27) : error C2662: “Stack<T>::Push”: 不能将“this”指针从“Stack”转换为“Stack<T> &”
1> 原因如下: 无法从“Stack”转换为“Stack<T>”
1> 转换要求第二个用户定义的转换运算符或构造函数
1>d:\vs程序\lab3.1\lab3.1\calculator.h(34) : error C2662: “Stack<T>::Push”: 不能将“this”指针从“Stack”转换为“Stack<T> &”
1> 原因如下: 无法从“Stack”转换为“Stack<T>”
1> 转换要求第二个用户定义的转换运算符或构造函数
1>d:\vs程序\lab3.1\lab3.1\calculator.h(43) : error C2662: “Stack<T>::Push”: 不能将“this”指针从“Stack”转换为“Stack<T> &”
1> 原因如下: 无法从“Stack”转换为“Stack<T>”
1> 转换要求第二个用户定义的转换运算符或构造函数
1>d:\vs程序\lab3.1\lab3.1\calculator.h(71) : error C2662: “Stack<T>::getTop”: 不能将“this”指针从“Stack”转换为“const Stack<T> &”
1> 原因如下: 无法从“Stack”转换为“const Stack<T>”
求各位指教!!!!
...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfafe 2011-11-04
  • 打赏
  • 举报
回复
那本书不好吗?我们学校发的书呀
dfafe 2011-11-02
  • 打赏
  • 举报
回复
我用的是vs2008呀,可是就是一直有问题。
xiejijun_05 2011-11-02
  • 打赏
  • 举报
回复
vc 6.0 下木有问题
ryfdizuo 2011-11-02
  • 打赏
  • 举报
回复
vs2008下木有问题
测试NULL 2011-11-02
  • 打赏
  • 举报
回复
我这里编译没错的啊? 啥原因呢?
加我Q:506341588 详聊

#include <iostream>
using namespace std;
#include <windows.h>
#include <assert.h>
template<class T>
struct LinkNode
{
T data;
LinkNode<T> *link;
LinkNode(LinkNode<T> *ptr=NULL){link=ptr;}
LinkNode(const T& item,LinkNode<T> *ptr=NULL)
{
data=item;
link=ptr;
}
};
template<class T>
class Stack
{
public:
Stack():top(NULL){}
~Stack() {makeEmpty();}
void Push(const T &x);
bool Pop(T &x);
bool getTop(T &x)const;
bool IsEmpty()const{return (top==NULL)?true:false;}
int getSize() const;
void makeEmpty();
friend ostream& operator << (ostream& os, const Stack<T> &s);
LinkNode<T> *top;

};
template<class T>
void Stack<T>::Push(const T &x)
{
top=new LinkNode<T>(x,top);
assert(top!=NULL);
};
template<class T>
bool Stack<T>::Pop(T &x)
{
if(IsEmpty()==true)return false;
LinkNode<T> *p=top;
top=top->link;
x=p->data;delete p;
return true;
};
template<class T>
bool Stack<T>::getTop(T &x) const
{
if(IsEmpty()==true) return false;
x=top->data;
return true;
};
template<class T>
int Stack<T>::getSize()const
{
LinkNode<T> *p=top;
int k=0;
while(p!=NULL)
{p=p->link;k++;}
return k;
};
template<class T>
void Stack<T>::makeEmpty()
{
LinkNode<T> *p;
while(top!=NULL)
{
p=top;
top=top->link;
delete p;
}
};
template<class T>
ostream& operator<< (ostream& os, const Stack<T> &s)
{
os << "栈中元素个数=" << s.getSize() << endl;
LinkNode<T> * p = s.top;
int i = 0;
while(p != NULL){
os << ++i << ":" << p -> data << endl;
if(p -> link == NULL)break;
p = p -> link;
}
return os;

}

int main()
{
return 0;
}
阿尔博特 2011-11-02
  • 打赏
  • 举报
回复
怎么那么像 殷人昆的那本书上的代码啊,如果lz在看那本书的话建议lz不要看了,或者偶尔看看,看这本《数据结构、算法与应用—C++语言描述》绝对经典

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧