невозможно преобразовать из 'void' в 'Token' (C ++) - PullRequest
1 голос
/ 24 июля 2011

Редактировать: Добавлен токен struct / enum в блок кода

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

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;
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 24 июля 2011

Проблема в том, что 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();

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

4 голосов
/ 24 июля 2011

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

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

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