将类型标记转换为char类型?

时间:2013-09-23 18:41:02

标签: c++ algorithm types casting char

我有一个Algo尝试调用Precedence函数,以便比较一个运算符是否优先于另一个运算符。我有一个错误,说我无法将类型令牌转换为char,我想知道我将如何这样做。

enter code here
int precedence(char op)
{
if (op == '*' || op == '/') return 0;
return 1;
}

bool comparePrecedence(char a, char b)
{
return precedence(a) < precedence(b);
}

double eval_infix_expr(vector<Token> ie, map<string,double> sym_tab)
{

vector<Token> postfix_expr;
vector<Token> tok_list;
vector<Token> t1;
stack <Token> stack;

while(!(ie.empty())){

    for(size_t i = 0; i < ie.size() ; i++){
            Token tok = ie[i];

    if(!(tok.type == OPERATOR)){
            postfix_expr.push_back(tok);
    }else if(tok.type == OPERATOR){
            while(precedence(tok)){}

        }
    }
}

2 个答案:

答案 0 :(得分:0)

在这一行:while(precedence(tok)){}中,您正在调用函数precedence,该函数接受参数char,但您传递的变量tok是{ {1}}

这两种类型无法转换。

我的水晶球说Token,程序可以编译,但这条线没有意义!充其量,它是无用的,在最坏的情况下,它是一个无限循环。

答案 1 :(得分:0)

您可以通过几种不同的方式实现这一目标:

显式演员

在课程Token中,您需要定义一个强制转换操作符:

class Token
{
public:
    // rest of declaration

    operator char() { return type; } // return whatever char value makes sense
};

然后当你致电while (precedence(tok)) {}时,它将能够隐式地投射它。

可替换地,

<强>访问器

您可以声明一个访问者并实际使用访问者:

,而不是依赖于强制转换
class Token
{
public:
    // rest of declaration

    char GetType() const { return type; } // or whatever makes sense for your token class
};

然后当你致电while (precedence(tok.GetType())) {}时(注意访问权限的不同),它会知道你在做什么。

侧面注意:

以下代码块并非真正必要:

if(!(tok.type == OPERATOR)) // if Not operator
{
    postfix_expr.push_back(tok);
}
else if(tok.type == OPERATOR) // else if operator
{
    while(precedence(tok)){}
}

避免潜在的无限循环,条件可写为

if (tok.type == OPERATOR) // if operator
{
    while(precedence(tok)){} // NOTE:  This will either be a noop, or an infinite loop ... never anything useful!
}
else // otherwise
{
    postfix_expr.push_back(tok);
}

让它更具可读性。