好的,我是C ++的新手。我收到了Bjarne的书,我正在尝试遵循计算器代码。
但是,编译器正在吐出有关此部分的错误:
token_value get_token()
{
char ch;
do { // skip whitespace except '\n'
if(!std::cin.get(ch)) return curr_tok = END;
} while (ch!='\n' && isspace(ch));
switch (ch) {
case ';':
case '\n':
std::cin >> WS; // skip whitespace
return curr_tok=PRINT;
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
return curr_tok=ch;
case '0': case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9': case '.':
std::cin.putback(ch);
std::cin >> number_value;
return curr_tok=NUMBER;
default: // NAME, NAME=, or error
if (isalpha(ch)) {
char* p = name_string;
*p++ = ch;
while (std::cin.get(ch) && isalnum(ch)) *p++ = ch;
std::cin.putback(ch);
*p = 0;
return curr_tok=NAME;
}
error("bad token");
return curr_tok=PRINT;
}
它吐出的错误是:
calc.cpp:42: error: invalid conversion from ‘char’ to ‘token_value’
token_value
是一个看起来像的枚举:
enum token_value {
NAME, NUMBER, END,
PLUS='+', MINUS='-', MUL='*', DIV='/',
PRINT=';', ASSIGN='=', LP='(', RP=')'
};
token_value curr_tok;
我的问题是,如何将ch(来自cin)转换为相关的枚举值?
答案 0 :(得分:8)
您无法隐式地从char
投射到enum
- 您必须明确地执行此操作:
return curr_tok = static_cast<token_value> (ch);
但要小心!如果您的enum
值均未与char
匹配,那么结果将很难使用:)
答案 1 :(得分:4)
请注意,给出的解决方案(即告诉您使用static_cast
)只能正确工作,因为在定义枚举符号时,符号(例如PLUS
)被定义为具有物理/数字恰好等于基础字符值的值(例如'+'
)。
另一种方法(不使用强制转换)将使用switch / case语句明确指定为每个字符值返回的枚举值,例如:
case '*':
return curr_tok=MUL;
case '/':
return curr_tok=DIV;
答案 2 :(得分:1)
你需要一个明确的演员:
curr_tok = static_cast<token_value>(ch);
原因是将整数类型转换为枚举是危险的。如果该值对枚举无效,则行为未定义。因此,语言不允许您通过隐式转换意外地执行此操作。显式转换应该表示“我知道我在做什么,并且我已经检查过该值是否有效”。
答案 3 :(得分:0)
我想我不会尝试显式设置枚举符号的值,而是为switch语句中的每个符号写一个大小写。如果出现问题并且为每个符号写一个案例的性能成本如此之低,那么这样做可能会更难调试,甚至不值得考虑(除非您正在为某种极低端的嵌入式系统编写代码)并且可能仍然不值得。)
答案 4 :(得分:-1)
return curr_tok=(token_value)ch;