2016-04-15 6 views
-1

Okay, das erste Mal stackoverflow verwenden, bitte mit mir.Verwendung der nicht deklarierten Kennung 'top'; meinst du "pop"?

mein Professor gab mir einen Code in C++ über Backtracking für ein boggle Spiel. aber es wird nicht für mich kompilieren. Ich erhalte diesen Fehler, den nicht deklarierten Bezeichner 'top'; meinst du "pop"? und here den Rest des Codes wenn nötig. Vielen Dank!

// 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; 
} 
+0

Der Compiler über nicht beschweren [ 'Stapel :: pop()'] (http://www.cplusplus.com/reference/stack/stack/pop/) aber über 'top()'? Vielleicht kann http://www.cplusplus.com/reference/stack/stack/top/ etwas Licht auf das Problem werfen ;-) – VolkerK

+0

Welchen Compiler benutzen Sie? Es kompiliert OK mit VS2013. –

+0

g ++. Ich programmiere auf meinem Mac, mein Professor benutzt VS. Ich wünschte, VS lief auf dem Mac :(. Wenn ich den gleichen Compiler wie VS würde es funktionieren? –

Antwort

1

fix es so:

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

gcc5.3 erklärt, warum:

/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 
+0

Complete gelöscht! Ich habe nie daran gedacht. Viel besser als meine Tonhöhe. – user4581301

+0

Dies erlaubt es zu kompilieren, aber es löst nicht das Labyrinth stoppt nur den Prozess und loggt mich aus der Konsole läuft es –

+2

@AlexLopez Ich denke, Sie sind in einer besseren Position, um zu wissen, was das Programm als ich tun sollte.Ich denke, er nächster Schritt für Sie ist, Einzelschritt durch der Code, um das Problem zu finden –