无法从'void'转换为'Token' (C++)



编辑:在代码块中添加token结构/enum

我是c++新手,所以如果我遗漏了一些明显的东西,请原谅我。我试图写一个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;
        }
    }
}

问题是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();

相关内容

  • 没有找到相关文章