遇见error: expected template-name before '<, codeblocks 13.12,GCC windous10

Max_inner 2016-03-01 09:55:58
这是我的代码:

路径:E:\学习\数据结构\stack.h
/*堆栈ADT
ADT Stack{
数据:
0个或多个元素的线性序列(a0,a1,...,an-1),其最大允许长度为MaxStackSize。
运算:
Create():建立一个空栈。
Destroy():撤销一个栈。
IsEmpty():若栈为空,则返回true;否则返回false。
IsFull():若栈满,则返回true;否则返回false。
Top(x):在x中返回栈顶元。若操作成功,则返回true;否则返回false。
Push(x):在栈顶插入元素x(入栈)。若操作成功,则返回true;否则返回false。
Ppo():从栈顶中删除元素(出栈)。若操作成功,则返回true;否则返回false。
Clear():清除堆栈中全部元素。
}*/
#include<iostream>
using namespace std;
template <class T>
class stack
{
public:
virtual bool IsEmpty() const=0;
virtual bool IsFull() const=0;
virtual bool Top(T &x) const=0;
virtual bool Push(T x)=0;
virtual bool Pop()=0;
virtual void Clear()=0;
};


路径:E:\学习\数据结构\seqstack.h
#include "..\\数据结构\\stack.h"
template<class T>
class SeqStack:public Stack<T>
{
public:
SeqStack(int mSize);
~SeqStack() {delete []s;}
bool IsEmpty() const {return top == -1;}
bool IsFull() const {return top == maxTop; }
bool Top(T &x) const;
bool Push(T x);
bool Pop();
void Clear(){ top = -1; }
private:
int top; //栈顶指针
int maxTop; //最大栈顶指针
T* s;
};
template<class T>
SeqStack<T>::SeqStack(int mSize)
{
maxTop=mSize-1;
s=new T[mSize];
top=-1;
}
template<class T>
bool SeqStack<T>::Top(T & x) const
{
if(IsEmpty()){
cout<<"Empty"<<endl;
return false;
}
x=s[top];
return true;
}
template<class T>
bool SeqStack<T>::Push(T x)
{
if(IsFull()){ //溢出处理
cout<<"Overflow"<<endl;
return false;
}
s[top++]=x;
return true;
}
template <class T>
bool SeqStack<T>::Pop()
{
if(IsEmpty()){ //空栈处理
cout<<"Underflow"<<endl;
return false;
}
top--;
return true;
}

路径:E:\学习\数据结构\简单的后缀表达式计算器\calculate.h
#include "..\seqstack.h"
#include<math.h>
class Calculator
{
public:
Calculator(int maxSize){s(maxSize);};
void Run(); //从输入流逐个读入字符,做相应的运算,输出结果
void Clear(){s.Clear();};
private:
SeqStack<double> s(maxSize); //声明存放操作数的栈对象
void PushOperand(double); //操作数进栈
bool GetOperands(double &,double &); //从栈中弹出2个操作数
void DoOperator(char); //根据操作符做相应的运算
};
void Calculator::PushOperand(double op)
{
s.Push(op);
}
bool Calculator::GetOperands(double &op1,double &op2)
{
if (!s.Top(op1)){
cerr<<"Missing operand!"<<endl;
return false;
}
s.Pop();
if(!s.Top(op2)){
cerr<<"Missing operand!"<<endl;
return false;
}
s.Pop();
return true;
}
void Calculator::DoOperator(char oper)
{
bool result;
double oper1,oper2;
result=GetOperands(ooper1,oper2); //从栈中弹出2个操作数
if(result)
switch(oper) //根据操作符做相应的运算,先出栈的操作数oper1
{ //放在操作符的右边,后出栈的oper2放在左边
case '+': s.Push(oper2+oper1); break;
case '-': s.Push(oper2-oper1); break;
case '*': s.Push(oper2*oper1); break;
case '/': if(fabs(oper1)<1e-6){ //如果分母为0,则做出错处理
cerr<<"Divide by 0!"<<endl;
Clear();
}
else s.Push(oper2/oper1);break;
}
else Clear();
}
void Calculator::Run()
{
char c;double newop;
while (cin>>c,c!='#'){ //从输入流试读入一个字符,遇结束符结束
switch(c){
case '+':
case '-':
case '*':
case '/':
case '^':DoOperator(c);break; //是操作符则进行相应的计算
default: cin.putback(c); //如不是操作符,则将试读入的字符放回输入流
cin>>newop;
PushOperand(newop);break; //操作数进栈
}
}
if(s.Top(newop)) cout<<newop<<endl; //取出栈顶元素
}

#include "calculator.h"
const int SIZE=20;
int main()
{
Calculator Cal(SIZE);
Cal.Run();
return 0;
}


ERROR:
E:\学习\数据结构\简单的后缀表达式计算器\..\seqstack.h|3|error: expected template-name before '<' token|
E:\学习\数据结构\简单的后缀表达式计算器\..\seqstack.h|3|error: expected '{' before '<' token|
E:\学习\数据结构\简单的后缀表达式计算器\..\seqstack.h|3|error: expected unqualified-id before '<' token|
E:\学习\数据结构\简单的后缀表达式计算器\..\seqstack.h|20|error: invalid use of incomplete type 'class SeqStack<T>'|
E:\学习\数据结构\简单的后缀表达式计算器\..\seqstack.h|3|error: declaration of 'class SeqStack<T>'|

还有好多ERROR,但主要就是第一个不知道怎么处理,看了几个帖子,都看不懂问题在哪。
...全文
415 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Max_inner 2016-03-02
  • 打赏
  • 举报
回复
经过反复测试,我终于找到了原因。 首先,我通过输入 21+# ,得到的结果为1,输入32*#得到的结果仍然为2;由此我推断出问题出在 void Calculator::DoOperator(char oper) { bool result; double oper1,oper2; result=GetOperands(oper1,oper2); //从栈中弹出2个操作数 if(result) switch(oper) //根据操作符做相应的运算,先出栈的操作数oper1 { //放在操作符的右边,后出栈的oper2放在左边 case '+': s.Push(oper2+oper1); break; case '-': s.Push(oper2-oper1); break; case '*': s.Push(oper2*oper1); break; case '/': if(fabs(oper1)<1e-6){ //如果分母为0,则做出错处理 cerr<<"Divide by 0!"<<endl; Clear(); } else s.Push(oper2/oper1);break; } else Clear(); } 上; 其次,我再次输入20/#,成功报错"Divide by 0!";而输入62/#,仍然报错"Divide by 0!";从而推断出数据入栈有问题; 最后,我检查了 bool SeqStack<T>::Push(T x) { if(IsFull()){ //溢出处理 cout<<"Overflow"<<endl; return false; } s[top++]=x; return true; } 发现 s[top++]=x; 应该为s[++top]=x; 继而完成了这个小程序。
Max_inner 2016-03-01
  • 打赏
  • 举报
回复
代码编译问题已解决,只是运行的结果是错误的,我先去找bug了。谢谢两位的help。
yshuise 2016-03-01
  • 打赏
  • 举报
回复
是不是默认的构造函数,编译器生成的
Max_inner 2016-03-01
  • 打赏
  • 举报
回复
不是这个大写了,而是 #include<iostream> using namespace std; template <class T> class stack 没大写,我改过来了,软件自带的stack,输入的时候直接点了回车,结果纠错一直在找class SeqStack:public Stack<T>的问题 另外,请问一下: class Calculator { public: Calculator(int maxSize):s(maxSize){}; void Run(); //从输入流逐个读入字符,做相应的运算,输出结果 void Clear(){s.Clear();}; private: SeqStack<double> s; //声明存放操作数的栈对象 void PushOperand(double); //操作数进栈 bool GetOperands(double &,double &); //从栈中弹出2个操作数 void DoOperator(char); //根据操作符做相应的运算 }; Calculator(int maxSize):s(maxSize){}; SeqStack<double> s; 调用顺序是什么? SeqStack<T>::SeqStack(int mSize) { maxTop=mSize-1; s=new T[mSize]; top=-1; } 不是要求创建 s对象时必须给出 mSize吗?SeqStack<double> s;这种形式为什么可以编译通过?
yshuise 2016-03-01
  • 打赏
  • 举报
回复
#include "..\\数据结构\\stack.h" template<class T> class SeqStack:public Stack<T> ======================================== s应该是小写,你大写了。

64,642

社区成员

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

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