您的位置:首页 > 其它

case expressions must be constant expressions

2017-04-11 17:42 447 查看
As the error message states, the case expressions must be constant. The compiler builds this as a very fast look-up table at compile time and it can't do that if there is a possibility that the values could change as the program runs.

If you do need them to be variable, not constant, your best bet is to use if/else statements instead.

方法一:

The
case
statements require integral value which must be known at compile-time, which is what is meant by constant here. But the
const
members of a class are not really constant in that sense. They're are simply read-only.

Instead of fields, you can use
enum
:

class ThisClass
{
public:

enum Constants
{
EXAMPLE_CONSTANT = 10,
ANOTHER_CONSTANT = 20
};
};

And then you can write,

switch(c)
{
case ThisClass::EXAMPLE_CONSTANT:
//code
break;
case ThisClass::ANOTHER_CONSTANT:
//code
break;
};


I am getting a 'case expression not constant' error in a switch statement. However, the header provides a definition for the used constants, and the constructor provides initialisation for them in its initialization list.

Additionally, when I mouse over the "problem" statements it identifies them as constants.

const int ThisClass::EXAMPLE_CONSTANT

error expression must have a constant value

This seems a little counter-intuitive to me. I did some research and found a similar problem that someone else had. They were told that all constants must in fact be initialised in 'main' and that this was a limitation of the language. Is this really the case? It seems unlikely.

You need a "real" compile time integer constant.
const
in C++ means read-only, and a const variable can be initialized just like
int y = 0; const int x = y;
, making
x
a read-only copy of the value
y
had at the time of initialization.

With a modern compiler, you can either use
enum
s or
constexpr
s to store (integral) members of compile-time-constness:

class Foo {
public:
static constexpr int x = 0;
enum { y = 1 };
};

int main () {
switch (0) {
case Foo::x: ;
case Foo::y: ;
}
}


其它: http://www.cplusplus.com/forum/beginner/74845/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: