質問

編集:コードブロックにトークン構造体/enumを追加しました

私はC ++が初めてなので、明らかなことを逃した場合は許してください。 Shunting Yardアルゴリズムの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 値を返さない。最初の要素を削除してその価値を読みたい場合は、2つのステップでそれを行うことができます。

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

この条約は、主に効率的な理由で、STL全体で採用されています。持っていることによって front 値を返し、 pop_front 何も返しません。必要に応じて値をキャプチャできますが、値を削除したい場合は、削除されたオブジェクトの不必要なコピーを作成することなく、呼び出すだけでそうすることができます。 pop_front.

このコードでは、後で同様のエラーが発生します。

output.push_back(opStack.pop());

これを修正するには、これを2つの行に分割します。

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

お役に立てれば!

他のヒント

それはあなたにエラーを与えます std::list<>::pop_front() aです void 関数。何も返さない。それでも、あなたはそれが何かを返すかのようにそれを使用しています。だから、質問は本当にあなたにとってです:なぜあなたは void 価値回転関数として機能しますか?どういう意味 Token t = tokenList.pop_front() ライン?

リストから最初の要素を「ポップ」しようとしていた場合、一連のステップが含まれます。

Token t = tokenList.front();
tokenList.pop_front();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top