Expression: cannot dereference end list iterator是什么意思?

问题描述 投票:0回答:1

我一直在我的代码上收到这个错误信息,它说它在第149行,但第149行什么都没有,所以我很难理解是什么问题。有人知道吗?

上下文--这是一个简单的平衡符号检查程序练习

这是错误信息 之后 我输入文件的名称。

enter image description here

这是完整的代码。

#include <iostream>
#include <fstream>
#include <string>
#include<list>

using namespace std; 

void openInputFile(ifstream& inFile);

template<class T>
class Stack {
    list <T> data;

public:
    Stack() : data() {}
    void push(T newItem) { data.push_front(newItem); }
    T pop() { T topVal = top(); data.pop_front(); 
    return topVal; }
    T top() const { return *data.begin(); }
    bool isEmpty() const { return data.size() == 0; }
    int size() const { return data.size(); }
    void clear() { data.clear(); }
};

class brackets {

    brackets() : bracket() {}

    char bracket; 

};


int main()
{
    Stack<char> dataChecker; 
    ifstream inFile; 
    string charChecker; 
    char currChar; 
    int size;
    bool goodToGo = true; 

    cout << "First enter the name of the data file, 
    then press enter. " << endl;
    openInputFile(inFile);

    while (getline(inFile, charChecker)) {

        size = charChecker.size(); 

        if (charChecker.find("begin") || 
        charChecker.find("Begin") || 
        charChecker.find("BEGIN")) {

            dataChecker.push('b'); 
        }

        if (charChecker.find("end") || 
            charChecker.find("End") || 
            charChecker.find("END")) {

            currChar = dataChecker.pop();

            if (currChar != 'b') {
                goodToGo = false; 
                break; 
            }
        }

        for (int i = 0; i < size; i+= 1) {

            if ((charChecker[i] == '{') || 
               (charChecker[i] == '}') || 
               (charChecker[i] == '[') || 
               (charChecker[i] == ']') ||
               (charChecker[i] == '(') || 
               (charChecker[i] == ')')) {

                  switch (charChecker[i]) {

                    case '{' :
                        dataChecker.push('{');

                    case '[': 
                        dataChecker.push('[');

                    case '(':
                        dataChecker.push('(');

                    case '}':

                        currChar = dataChecker.pop();

                        if (currChar != '{') {
                            goodToGo = false;
                            break;
                        }

                    case ']':

                        currChar = dataChecker.pop();

                        if (currChar != '[') {
                            goodToGo = false;
                            break;
                        }

                    case ')':

                        currChar = dataChecker.pop();

                        if (currChar != '(') {
                            goodToGo = false;
                            break;
                        }



                }

            }




        }

    }

    if (goodToGo == false) {
        cout << "There is an error in the data." << 
         endl; 
    }

    else {
        cout << "The data looks good!" << endl;
    }




    return 0; 
}

void openInputFile(ifstream& inFile) {

    cout << "Please enter a filename: ";
    string filename;
    cin >> filename;
    inFile.open(filename);
    while (!inFile) {
        cout << "Bad file name";
        cout << "Please enter a filename: ";
        cin >> filename;
        inFile.clear();
        inFile.open(filename);
    }
}
c++
1个回答
0
投票

查看文件的第149行 <list> 对话框信息中给出了完整的路径,也可以右键点击,打开后在 #include <list> 编辑器中的帮助)。)

    _NODISCARD reference operator*() const {
#if _ITERATOR_DEBUG_LEVEL == 2
        const auto _Mycont = static_cast<const _Mylist*>(this->_Getcont());
        _STL_ASSERT(_Mycont, "cannot dereference value-initialized list iterator");
        _STL_VERIFY(this->_Ptr != _Mycont->_Myhead, "cannot dereference end list iterator");
#endif // _ITERATOR_DEBUG_LEVEL == 2

        return this->_Ptr->_Myval;
    }

所以这很简单。你有一个列表迭代器(例如 iter)并称 operator* 上(-&gt。*iter). 这是不允许的,断言就是告诉你这一点。当你在调试器中运行程序并查看调用栈时,你可以直接导航到你调用了 *iter.

也许你在打电话 toppop 在一个空栈上?

© www.soinside.com 2019 - 2024. All rights reserved.