-1

My professor gave me some code in c++ about backtracking for a boggle game. but it won't compile for me. I get this error , use of undeclared identifier 'top'; did you mean 'pop'?, and heres the rest of the code if needed. Thanks!

// Maze01.cpp : Defines the entry point for the console application.

#include <cstdlib>
#include <iostream>
#include <stack>
using namespace std;
template<class T>
class Stack : public stack<T> {
public:
    T pop() {
        T tmp = top(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        stack<T>::pop();
        return tmp;
    }
};

class Cell {
public:
    Cell(int i = 0, int j = 0) {
        x = i; y = j;
    }
    bool operator== (const Cell& c) const {
        return x == c.x && y == c.y;
    }
private:
    int x, y;
    friend class Maze;
};

class Maze {
public:
    Maze();
    void exitMaze();
private:
    Cell currentCell, exitCell, entryCell;
    const char exitMarker, entryMarker, visited, passage, wall;
    Stack<Cell> mazeStack;
    char **store;         // array of strings;
    void pushUnvisited(int, int);
    int rows, cols;
    friend ostream& operator<< (ostream& out, const Maze& maze) {
        for (int row = 0; row <= maze.rows + 1; row++)
            out << maze.store[row] << endl;
        out << endl;
        return out;
    }
};

Maze::Maze() : exitMarker('e'), entryMarker('m'), visited('.'),
passage('0'), wall('1') {
    Stack<char*> mazeRows;
    char str[80], *s;
    int col, row = 0;
    cout << "Enter a rectangular maze using the following "
        << "characters:\nm - entry\ne - exit\n1 - wall\n0 - passage\n"
        << "Enter one line at at time; end with Ctrl-z:\n";
    while (cin >> str)
    {
        row++;
        cols = strlen(str);
        s = new char[cols + 3];    // two more cells for borderline columns;
        mazeRows.push(s);
        strcpy(s + 1, str);
        s[0] = s[cols + 1] = wall; // fill the borderline cells with 1s;
        s[cols + 2] = '\0';
        if (strchr(s, exitMarker) != 0)
        {
            exitCell.x = row;
            exitCell.y = strchr(s, exitMarker) - s;
        }
        if (strchr(s, entryMarker) != 0)
        {
            entryCell.x = row;
            entryCell.y = strchr(s, entryMarker) - s;
        }
    }
    rows = row;
    store = new char*[rows + 2];        // create a 1D array of pointers;
    store[0] = new char[cols + 3];      // a borderline row;
    for (; !mazeRows.empty(); row--) {
        store[row] = mazeRows.pop();
    }
    store[rows + 1] = new char[cols + 3]; // another borderline row;
    store[0][cols + 2] = store[rows + 1][cols + 2] = '\0';
    for (col = 0; col <= cols + 1; col++) {
        store[0][col] = wall;         // fill the borderline rows with 1s;
        store[rows + 1][col] = wall;
    }
}

void Maze::pushUnvisited(int row, int col) {
    if (store[row][col] == passage || store[row][col] == exitMarker) {
        mazeStack.push(Cell(row, col));
    }
}
void Maze::exitMaze() {
    int row, col;
    currentCell = entryCell;
    while (!(currentCell == exitCell)) {
        row = currentCell.x;
        col = currentCell.y;
        cout << *this;         // print a snapshot;
        if (!(currentCell == entryCell))
            store[row][col] = visited;
        pushUnvisited(row - 1, col);
        pushUnvisited(row + 1, col);
        pushUnvisited(row, col - 1);
        pushUnvisited(row, col + 1);
        if (mazeStack.empty()) {
            cout << *this;
            cout << "Failure\n";
            return;
        }
        else currentCell = mazeStack.pop();
    }
    cout << *this;
    cout << "Success\n";
}


int main(int argc, char* argv[])
{

    Maze().exitMaze();
    return 0;
}
Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
Alex Lopez
  • 3
  • 1
  • 2
  • The compiler doesn't complain about [`stack::pop()`](http://www.cplusplus.com/reference/stack/stack/pop/) but about `top()`? Maybe http://www.cplusplus.com/reference/stack/stack/top/ can shed some light on the problem ;-) – VolkerK Apr 15 '16 at 00:16
  • What compiler are you using? It compiles OK with VS2013. – The Dark Apr 15 '16 at 00:16
  • g++. I program on my mac, my professor uses VS. I wish VS ran on mac :(. If i use the same compiler as VS would it work? – Alex Lopez Apr 15 '16 at 00:20
  • Note what your instructor did one line down. Do the same and force the template specialization. Then add an include for up at the top of the file with the rest of the includes because that's likely to be the answer to your next question. – user4581301 Apr 15 '16 at 00:24

1 Answers1

1

fix it this way:

    T tmp = this->top(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

gcc5.3 explains why:

/tmp/gcc-explorer-compiler116315-75-7jbdnd/example.cpp: 
    In member function 'T Stack<T>::pop()':
13 : error: there are no arguments to 'top' that depend on a template parameter, 
    so a declaration of 'top' must be available [-fpermissive]
T tmp = top(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
^
13 : note: (if you use '-fpermissive', G++ will accept your code, 
    but allowing the use of an undeclared name is deprecated)
Compilation failed
Richard Hodges
  • 68,278
  • 7
  • 90
  • 142
  • Expletive deleted! I never even thought of that. Way better than my pitch. – user4581301 Apr 15 '16 at 00:31
  • 1
    This allowed it to compile but it doesn't solve the maze it just stops the process and logs me out of the console running it – Alex Lopez Apr 15 '16 at 00:37
  • 2
    @AlexLopez I think you're in a better position to know what the program should do than me. I think he next step for you is to single step through the code to find the problem. – Richard Hodges Apr 15 '16 at 00:40
  • I know what the program should do. I've used it before i just wanted it on my computer to study from, Thanks for the help though! – Alex Lopez Apr 15 '16 at 00:42
  • I'd take that advice if I were you. Walking through code, working or not, is very helpful to learning. – user4581301 Apr 15 '16 at 04:13