Вопрос

РЕДАКТИРОВАТЬ: Добавлено токен struct/enum в кодовый блок

Я новичок в C ++, так что прости меня, если я пропустил что -то очевидное. Я пытаюсь написать версию C ++ алгоритма шунтирующего двора, но она не будет компилироваться, потому что это дает мне ошибку: «не может преобразовать из« void »в« токен »(на линии, которую я пометил)». Кто -нибудь может сказать мне, почему это дает эту ошибку?

typedef enum TokenType { None, Number, Operator, LeftParens, RightParens };

struct Token
{
    enum TokenType type;
    union
    {
        int num;
        char op;
    };
};

list<Token> DoShuntingYard(list<Token> tokenList)
{
    stack<Token> opStack;
    list<Token> output;
    while (!tokenList.empty())
    {
        ****(This Line) Token t = tokenList.pop_front();
        switch (t.type)
        {
        case Number:
            output.push_back(t);
            break;
        case Operator:
            if (!opStack.empty())
            {
                Token op2 = opStack.top();
                if ((IsLeftAssoc(t) && GetOpPrecedence(t) <= GetOpPrecedence(op2)) || (!IsLeftAssoc(t) && GetOpPrecedence(t) < GetOpPrecedence(op2)))
                {
                    output.push_back(opStack.pop());
                }
            }
            break;
        }
    }
}
Это было полезно?

Решение

Проблема в том, что pop_front не возвращает значение. Если вы хотите удалить первый элемент и прочитать его значение, вы можете сделать это через два шага:

Token t = tokenList.front();
tokenList.pop_front();

Эта конвенция используется по всему STL, в основном по причинам эффективности. Имея front вернуть значение и pop_front ничего не верните, вы можете запечатлеть значение, если хотите, но если вы просто хотите удалить значение, вы можете сделать это, не сделав ненужную копию удаленного объекта, просто вызывая pop_front.

Вы столкнетесь с аналогичной ошибкой позже с этим кодом:

output.push_back(opStack.pop());

Чтобы исправить это, разделите это на две линии:

output.push_back(opStack.top());
opStack.pop();

Надеюсь это поможет!

Другие советы

Это дает вам ошибку, потому что std::list<>::pop_front() это void функция Это ничего не возвращает. Тем не менее, вы используете его так, как будто он что -то возвращает. Итак, вопрос действительно для вас: почему вы пытаетесь использовать void функция как функция возврата значений? Что ты имеешь ввиду Token t = tokenList.pop_front() линия?

Если бы вы пытались «выпить» первый элемент из списка, возможная последовательность шагов будет включать в себя

Token t = tokenList.front();
tokenList.pop_front();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top