错误:开关量不是整数

我已经通过 StackOverflow 和多谷歌链接研究了我的问题,但我仍然感到困惑.我认为对我来说最好的事情就是问...

I have researched my issue all over StackOverflow and multi-google links, and I am still confused. I figured the best thing for me is ask...

我正在创建一个简单的命令行计算器.到目前为止,这是我的代码:

Im creating a simple command line calculator. Here is my code so far:

const std::string Calculator::SIN("sin");  
const std::string Calculator::COS("cos");  
const std::string Calculator::TAN("tan");  
const std::string Calculator::LOG( "log" );  
const std::string Calculator::LOG10( "log10" );

void Calculator::set_command( std::string cmd ) {

    for(unsigned i = 0; i < cmd.length(); i++)
    {
    cmd[i] = tolower(cmd[i]);
    }

    command = cmd;
}

bool Calculator::is_legal_command() const {

    switch(command)
    {
    case TAN:
    case SIN:
    case COS:
    case LOG:
    case LOG10:
        return true;
        break;
    default:
        return false;
        break;
    }

}

我得到的错误是:

Calculator.cpp: In member function 'bool Calculator::is_trig_command() const':  
Calculator.cpp: error: switch quantity not an integer  
Calculator.cpp: error: 'Calculator::TAN' cannot appear in a constant-expression  
Calculator.cpp: error: 'Calculator::SIN' cannot appear in a constant-expression  
Calculator.cpp: error: 'Calculator::COS' cannot appear in a constant-expression  

强大的互联网,它说允许在 switch 语句中使用字符串.

The mighty internet, it says strings are allowed to be used in switch statements.

谢谢大家,感谢您的帮助.

Thanks everyone, I appreciate your help.

推荐答案

switch中,表达式必须是an 整数类型或具有明确转换为整数类型的类类型" (引用 VS2008 文档).

In switch, the expression must be of "an integral type or of a class type for which there is an unambiguous conversion to integral type" (quoting VS2008 docs).

字符串类没有像 char 那样明确转换为整数类型".

A string class doesn't have "unambiguous conversion to integral type", like a char does.

作为一种解决方法:

  1. 创建一个map并开启map的值:switch(command_map[command])`

做一组if/else代替switch.更烦人且难以阅读,所以我推荐地图路线.

Do a set of if/else instead of switch. Much more annoying and hard to read, so I'd recommend the map route.

顺便说一句,对于真正复杂的逻辑,一个更好的解决方案是改进映射解决方案以完全摆脱 switch 并使用函数查找:std::地图<std::string, functionPointerType>.您的特定情况可能不需要它,但对于复杂的非常长的查找逻辑来说要快得多.

As an aside, an even better solution for really complicated logic like that is to improve the mapping solution to get rid of switch completely and instead go with a function lookup: std::map<std::string, functionPointerType>. It may not be needed for your specific case, but is MUCH faster for complicated very long look-up logic.

相关文章