代码之家  ›  专栏  ›  技术社区  ›  Glen Solsberry

字符的C++枚举

  •  5
  • Glen Solsberry  · 技术社区  · 15 年前

    好,我是C++新手。我拿到了比亚恩的书,我试着跟着计算器的代码。

    但是,编译器抛出了一个有关此部分的错误:

    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)转换为关联的枚举值?

    5 回复  |  直到 15 年前
        1
  •  9
  •   Jesse Beder    15 年前

    您不能隐式地从 char enum -您必须明确地这样做:

    return curr_tok = static_cast<token_value> (ch);
    

    但是要小心!如果你的

        2
  •  4
  •   ChrisW    15 年前

    请注意,给出的解决方案(即告诉您使用 static_cast )仅当定义枚举符号时,符号(例如。 PLUS )被定义为具有恰好等于基础字符值的物理/数字值(例如。 '+' ).

    另一种方法(不使用强制转换)是使用switch/case语句显式指定为每个字符值返回的枚举值,例如:

        case '*':
          return curr_tok=MUL;
        case '/':
          return curr_tok=DIV;
    
        3
  •  1
  •   Paul    15 年前

    您需要显式强制转换:

    curr_tok = static_cast<token_value>(ch);
    

        4
  •  0
  •   Jonathan Swinney    15 年前

    我想我不会尝试显式地设置枚举符号的值,而是为switch语句中的每个符号编写一个case。如果出现问题,那么这样做可能更难调试,而且为每个符号编写一个案例的性能成本非常低,甚至不值得考虑(除非您是为某种极低端的嵌入式系统编写的,而且可能仍然不值得)。

        5
  •  -1
  •   Keith Nicholas    15 年前
    return curr_tok=(token_value)ch;