简体   繁体   中英

Stack auto variable in c++

I'm new to c ++ and I'm wanting to build a stack with ​​automatic variables, however, get a series of errors in the array, dr can help me fix it thanks. Apparently the array a is wrongly declared and the top() function is in conflict, but I don't see this problem, as I have little familiarity with automatic variables I'm a little lost. Here's the code and errors:

#include <bits/stdc++.h>
#include <array>
#include <iostream>

using namespace std;

#define MAX 1000

class Stack {
    int top;

public:
    auto a[MAX];

    Stack() { top = -1; }
    bool push(auto x);
    auto pop();
    auto top();
    bool isEmpty();
};

bool Stack::push(auto x)
{
    if (top >= (MAX - 1)) {
        cout << "Stack Overflow";
        return false;
    }
    else {
        a[++top] = x;
        cout << x << " pushed into stack\n";
        return true;
    }
}

auto Stack::pop()
{
    if (top < 0) {
        cout << "Stack Underflow";
        return 0;
    }
    else {
        auto x = a[top--];
        return x;
    }
}
auto Stack::top()
{
    if (top < 0) {
        cout << "Stack is Empty";
        return 0;
    }
    else {
        auto x = a[top];
        return x;
    }
}

bool Stack::isEmpty()
{
    return (top < 0);
}

int main() {
    class Stack stk;
    stk.push(4);
    stk.push(5);
    stk.push(6);

}

Error:

In file included from asgt.h:6,
                 from asgt.cpp:1:
graph.h:45:10: error: ‘a’ declared as array of ‘auto’
   45 |     auto a[MAX];
      |          ^
graph.h:48:15: warning: use of ‘auto’ in parameter declaration only available with ‘-fconcepts’
   48 |     bool push(auto x);
      |               ^~~~
graph.h:50:14: error: ‘auto Stack::top()’ conflicts with a previous declaration
   50 |     auto top();
      |              ^
graph.h:42:9: note: previous declaration ‘int Stack::top’
   42 |     int top;
      |         ^~~
graph.h:54:18: warning: use of ‘auto’ in parameter declaration only available with ‘-fconcepts’
   54 | bool Stack::push(auto x)
      |                  ^~~~
graph.h: In member function ‘bool Stack::push(auto:2)’:
graph.h:61:9: error: ‘a’ was not declared in this scope
   61 |         a[++top] = x;
      |         ^
graph.h: In member function ‘auto Stack::pop()’:
graph.h:74:18: error: ‘a’ was not declared in this scope
   74 |         auto x = a[top--];
      |                  ^
graph.h: At global scope:
graph.h:78:6: error: no declaration matches ‘auto Stack::top()’
   78 | auto Stack::top()
      |      ^~~~~
graph.h:42:9: note: candidate is: ‘int Stack::top’
   42 |     int top;
      |         ^~~
graph.h:41:7: note: ‘class Stack’ defined here
   41 | class Stack {
      |       ^~~~~
asgt.cpp:17:26: warning: use of ‘auto’ in parameter declaration only available with ‘-fconcepts’

You need to use templates for that. The declaration of your Stack class should look more something like:

template <class T>
class Stack<T> {
    int top;

public:
    T a[MAX];

    Stack() { top = -1; }
    bool push(const T& x); // can't afford to copy if your Stack is general purpose
    T pop();
    T get_top(); // can't have same name for member and method
    bool isEmpty();
};

Also, probably you might want to overload push() in order to pass both by const reference and by lvalue reference (that is, to move something in your stack). And you definitely want to make a private.

The error messages of the used compiler mean the following.

Such a declaration of an array

auto a[MAX];

is invalid. The compiler is unable to determine the actual type of the array. Using the specifier auto with array declarations is prohibited.

A function parameter may not be declared with the specifier auto.

bool push(auto x);

Data member and member function may not have the same name

int top;
//...
auto top();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM