Pregunta

Editar: Token Struct/enum agregado al bloque de código

Soy nuevo en C ++, así que perdóname si me perdí algo obvio. Estoy tratando de escribir una versión C ++ del algoritmo de patio de derivación, pero no se compilará porque me da el error: "No se puede convertir de 'vacío' a 'token' (en la línea que marcé)". ¿Alguien puede decirme por qué da este error?

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;
        }
    }
}
¿Fue útil?

Solución

El problema es ese pop_front no devuelve un valor. Si desea eliminar el primer elemento y leer su valor, puede hacerlo en dos pasos:

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

Esta convención se emplea en todo el STL, principalmente por razones de eficiencia. Por tener front devolver el valor y pop_front no devuelve nada, puede capturar el valor si lo desea, pero si solo desea eliminar el valor, puede hacerlo sin hacer una copia innecesaria del objeto eliminado simplemente llamando pop_front.

Se encontrará con un error similar más adelante con este código:

output.push_back(opStack.pop());

Para arreglar esto, divida esto en dos líneas:

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

¡Espero que esto ayude!

Otros consejos

Te da el error porque std::list<>::pop_front() es un void función. No devuelve nada. Sin embargo, lo está usando como si devuelva algo. Entonces, la pregunta es realmente para ti: ¿por qué estás intentando usar un void función como una función de retorno de valor? Que quieres decir con Token t = tokenList.pop_front() ¿línea?

Si intentara "explotar" el primer elemento de la lista, la posible secuencia de pasos incluiría

Token t = tokenList.front();
tokenList.pop_front();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top