Domanda

Modifica: Aggiunto gettone struct / enum al blocco di codice

Sono nuovo di C ++, quindi perdonatemi se ho perso qualcosa di ovvio. Sto cercando di scrivere una versione C ++ del Cantiere Algorithm Manovra, ma non si compila perché mi dà l'errore: "non può convertire da 'vuoto' a 'token' (sulla linea ho segnato)." Qualcuno può dirmi il motivo per cui dà questo errore?

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;
        }
    }
}
È stato utile?

Soluzione

Il problema è che pop_front non restituisce un valore. Se si desidera rimuovere il primo elemento e leggere il suo valore, è possibile farlo in due fasi:

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

Questa convenzione è impiegato in tutto lo STL, per lo più per ragioni di efficienza. Avendo front restituire il nulla di valore e pop_front di ritorno, è possibile catturare il valore se si vuole, ma se si desidera solo per rimuovere il valore è possibile farlo senza fare una copia inutile di rimuovere l'oggetto da solo pop_front chiamando.

verrà eseguito in un errore simile in seguito con questo codice:

output.push_back(opStack.pop());

Per risolvere questo problema, dividere questo in due linee:

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

Spero che questo aiuti!

Altri suggerimenti

Ti dà l'errore perché std::list<>::pop_front() è una funzione void. Esso non restituisce nulla. Eppure, lo si utilizza come se restituisce qualcosa. Quindi, la questione è davvero a voi: perché stai tentando di utilizzare una funzione void come una funzione di valore di ritorno? Che cosa si intende per linea Token t = tokenList.pop_front()?

Se stavi cercando di "pop" il primo elemento dalla lista, la possibile sequenza di passi dovrebbe includere

Token t = tokenList.front();
tokenList.pop_front();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top