不能把'无效"到"令牌'(C++)
-
25-10-2019 - |
题
编辑:加入令牌struct/枚举块代码
我是新来c++,所以原谅我如果我错过了什么显而易见的。我尝试写一c++版本的调码算法,但是它不会编纂,因为它给了我错误:"不能转换从'无效"到"令牌'(在线我标出)。" 任何人都可以告诉我为什么它给出了这样的错误?
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
不返回值。如果要删除第一个元素并读取其值,则可以分为两个步骤:
Token t = tokenList.front();
tokenList.pop_front();
该公约在整个STL中都采用,主要是出于效率原因。有了 front
返回值, pop_front
什么也没返回,如果需要的话,您可以捕获值,但是如果您只想删除值 pop_front
.
稍后,您将使用此代码遇到类似的错误:
output.push_back(opStack.pop());
要解决此问题,请将其分为两行:
output.push_back(opStack.top());
opStack.pop();
希望这可以帮助!
其他提示
它给你的错因为 std::list<>::pop_front()
是一个 void
功能。它不回任何东西。但是,你正在使用它,因为如果返回的东西。因此,问题是真的你:为什么你试图使用一个 void
功能作为一个值返回的功能?你是什么意思 Token t = tokenList.pop_front()
线呢?
如果你试图对"流行"的第一个元素名单,可能的步骤顺序将包括
Token t = tokenList.front();
tokenList.pop_front();
不隶属于 StackOverflow