2

これが私がエラーのために持っているものです:

In file included from braincalc.cpp:8:0:
AbstractStack.h:43:1: error: expected class-name before â{â token

これが私の.hです:

//AbstractStack.h

#ifndef ABSTRACTSTACK_H
#define ABSTRACTSTACK_H

#include<iostream>
using namespace std;

template < typename T >
class AbstractStack
{
public:

  // Purpose: clears the stack
  // Postconditions: the stack is now empty 
  virtual void clear() = 0;

  // Purpose: push an element into the stack
  // Parameters: x is the value to push into the stack
  // Postconditions: x is now the element at the top of the stack, 
  virtual void push(T x) = 0;


  // Purpose: pop the stack
  // Postconditions: the element formerly at the top of the stack has
  // been removed
  // Panic: if the stack is currently empty, PANIC!
  virtual void pop() = 0;


  // Purpose: looks at the top of the stack
  // Returns: a reference to the element currently on top of the stack
  // Panic: if the stack is currently empty, PANIC!

  virtual T& top() = 0;


  // Purpose: Checks if a stack is empty
  // Returns: 'true' if the stack is empty
  //     'false' otherwise  
  virtual bool isEmpty() = 0;
};

class LinkedStack: public AbstractStack
{
  public:
    int m_data;
    LinkedStack *m_next;

    void clear()
    {
      LinkedStack *p;
      LinkedStack *tmp;

      while(m_next != NULL)
      {
        p = this;
        tmp = p -> m_next;
        delete p;
      }
    } 

    void push(int x)
    {
      LinkedStack *tmp = new LinkedStack;
      tmp -> m_data = m_data;
      tmp -> m_next = m_next;
      m_data = x;
      m_next = tmp;
    }

    void pop()
    {
      LinkedStack *tmp;

      if (m_next != NULL)
      {
        tmp = m_next;
        m_data = tmp -> m_data;
        m_next = tmp -> m_next;
        delete tmp;
      }
    }

    int& top()
    {
        return m_data;
    }

    bool isEmpty()
    {
      bool empty = false;

      if (m_next == NULL)
      {
        empty = true;
      }

      return empty;
    }
};

#endif

.cpp は次のとおりです。

//braincalc.cpp

#include"AbstractStack.h"
#include<string>
#include<cstdlib>


int main()
{
  string input;
  bool again=true;
  int ctr=0;
  int temp1, temp2;
  LinkedStack stack;

  do
  {
    getline(cin, input, '$');
    input.c_str();

    if (isdigit(input[ctr]))
    {
      stack.push(atoi(&input[ctr]));
      ctr++;
    }

    else if (isspace(input[ctr]))
    {
      ctr++;
    }

    else if (input[ctr] == '*')
    {
      temp2 = stack.top();
      stack.pop();
      temp1 = stack.top();
      stack.pop();
      stack.push(temp1 * temp2);
      ctr++;
    }

    else if (input[ctr] == '/')
    {
      temp2 = stack.top();
      stack.pop();
      temp1 = stack.top();
      stack.pop();
      stack.push(temp1 / temp2);
      ctr++;
    }

    else if (input[ctr] == '+')
    {
      temp2 = stack.top();
      stack.pop();
      temp1 = stack.top();
      stack.pop();
      stack.push(temp1 + temp2);
      ctr++;
    }

    else if (input[ctr] == '-')
    {
      temp2 = stack.top();
      stack.pop();
      temp1 = stack.top();
      stack.pop();
      stack.push(temp1 - temp2);
      ctr++;
    }

    else if (input[ctr] == '!')
    {
      temp1 = stack.top();
      stack.pop();
      stack.push(-temp1);
      ctr++;
    }

    else if (input[ctr] == '#')
    {
      again = false;
      ctr=0;
    }

  } while(again == true);

  cout << "["<<stack.top()<<"]"<<endl;

  return 0;
}

コードが完成していないことはわかっていますが、このエラーにより、思ったように機能するかどうかをテストできません。ありがとうございます。

4

1 に答える 1

6

AbstractStackはクラスではないため、次のように書くことはできません。

class LinkedStack: public AbstractStack

LinkedStackテンプレートを作成する必要があります。

template<class T>
class LinkedStack: public AbstractStack<T>

または次の特殊化から派生しますAbstractStack

class LinkedStack: public AbstractStack<int>
于 2012-10-04T07:49:54.293 に答える