не может преобразовать из «void» в «токен» (C ++)
-
25-10-2019 - |
Вопрос
РЕДАКТИРОВАТЬ: Добавлено токен 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();