我在switch语句中得到一个'case expression not constant'错误.但是,标头为使用的常量提供了定义,构造函数在其初始化列表中为它们提供了初始化.
另外,当我将鼠标悬停在"问题"语句上时,它会将它们标识为常量.
const int ThisClass::EXAMPLE_CONSTANT
error expression must have a constant value
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点违反直觉.我做了一些研究,发现了其他人的类似问题.他们被告知所有常量实际上必须在'main'中初始化,并且这是语言的限制.这是真的吗?似乎不太可能.
Naw*_*waz 17
这些case语句需要在编译时必须知道的整数值,这就是常量.但是在这个意义上const,一个阶级的成员并不是真正的常数.它们只是只读的.
您可以使用enum以下内容代替字段:
class ThisClass
{
public:
enum Constants
{
EXAMPLE_CONSTANT = 10,
ANOTHER_CONSTANT = 20
};
};
Run Code Online (Sandbox Code Playgroud)
然后你可以写,
switch(c)
{
case ThisClass::EXAMPLE_CONSTANT:
//code
break;
case ThisClass::ANOTHER_CONSTANT:
//code
break;
};
Run Code Online (Sandbox Code Playgroud)
您需要一个“真正的”编译时整数常量。const在 C++ 中意味着只读,并且可以像 一样初始化 const 变量int y = 0; const int x = y;,从而x生成初始化时的值的只读副本y。
使用现代编译器,您可以使用enums 或constexprs 来存储 compile-time-constness 的(整数)成员:
class Foo {
public:
static constexpr int x = 0;
enum { y = 1 };
};
int main () {
switch (0) {
case Foo::x: ;
case Foo::y: ;
}
}
Run Code Online (Sandbox Code Playgroud)