编辑:加入令牌struct/枚举块代码

我是新来c++,所以原谅我如果我错过了什么显而易见的。我尝试写一c++版本的调码算法,但是它不会编纂,因为它给了我错误:"不能转换从'无效"到"令牌'(在线我标出)。" 任何人都可以告诉我为什么它给出了这样的错误?

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