「ボイド」から「トークン」(C ++)に変換できません
-
25-10-2019 - |
質問
編集:コードブロックにトークン構造体/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();
所属していません StackOverflow