Frage

Bearbeiten: Token Struct/Enum zum Codeblock hinzugefügt

Ich bin neu in C ++, also vergib mir, wenn ich etwas Offensichtliches verpasst habe. Ich versuche, eine C ++ - Version des Shunting Yard -Algorithmus zu schreiben, aber es wird nicht kompiliert, weil es mir den Fehler gibt: "Kann nicht von 'void' in 'token' konvertieren (in der Zeile, die ich markierte)." Kann mir jemand sagen, warum er diesen Fehler gibt?

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;
        }
    }
}
War es hilfreich?

Lösung

Das Problem ist, dass pop_front Gibt keinen Wert zurück. Wenn Sie das erste Element entfernen und seinen Wert lesen möchten, können Sie dies in zwei Schritten tun:

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

Diese Konvention wird im gesamten STL verwendet, hauptsächlich aus Effizienzgründen. Indem front den Wert zurückgeben und pop_front Rückgabe nichts, Sie können den Wert erfassen, wenn Sie möchten, aber wenn Sie nur den Wert entfernen möchten, können Sie dies tun, ohne eine unnötige Kopie des entfernten Objekts zu erstellen, indem Sie nur aufrufen pop_front.

Sie werden später mit diesem Code auf einen ähnlichen Fehler stoßen:

output.push_back(opStack.pop());

Um dies zu beheben, teilen Sie dies in zwei Zeilen auf:

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

Hoffe das hilft!

Andere Tipps

Es gibt Ihnen den Fehler, weil std::list<>::pop_front() ist ein void Funktion. Es gibt nichts zurück. Sie verwenden es jedoch, als ob es etwas zurückgibt. Die Frage ist also wirklich für Sie: Warum versuchen Sie, a zu verwenden? void Funktion als Wertschöpfungsfunktion? Was meinst du mit Token t = tokenList.pop_front() Linie?

Wenn Sie versuchen würden, das erste Element aus der Liste zu "popieren", würde die mögliche Abfolge von Schritten enthalten

Token t = tokenList.front();
tokenList.pop_front();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top