Question

Edit: Ajout jeton struct / ENUM au bloc de code

Je suis nouveau à c ++, alors pardonnez-moi si je manqué quelque chose d'évident. Je suis en train d'écrire un c ++ version de l'algorithme cour de triage, mais il ne compilera pas car il me donne l'erreur: « ne peut pas convertir « vide » à « Token »(sur la ligne que j'ai marqué). » Quelqu'un peut-il me dire pourquoi il donne cette erreur?

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;
        }
    }
}
Était-ce utile?

La solution

Le problème est que pop_front ne retourne pas de valeur. Si vous voulez supprimer le premier élément et lire sa valeur, vous pouvez le faire en deux étapes:

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

Cette convention est employée tout au long de la STL, principalement pour des raisons d'efficacité. En ayant front retourner la valeur et pop_front rien de retour, vous pouvez saisir la valeur si vous voulez, mais si vous voulez juste supprimer la valeur que vous pouvez le faire sans faire une copie inutile de retirer l'objet simplement appeler pop_front.

Vous courrez dans une erreur similaire plus tard avec ce code:

output.push_back(opStack.pop());

Pour résoudre ce problème, découpé dans deux lignes:

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

Hope this helps!

Autres conseils

Il vous donne l'erreur car std::list<>::pop_front() est une fonction void. Il ne retourne rien. Pourtant, vous utilisez comme si elle retourne quelque chose. Donc, la question est vraiment de vous: pourquoi êtes-vous tentez d'utiliser une fonction void en fonction de la valeur de retour? Que voulez-vous dire par ligne Token t = tokenList.pop_front()?

Si vous essayiez au premier élément « pop » de la liste, la séquence d'étapes possibles comprendrait

Token t = tokenList.front();
tokenList.pop_front();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top