vri*_*nce 13 c++ gcc const switch-statement
我有一些静态const成员的声明
.H
class MyClass : public MyBase
{
public:
static const unsigned char sInvalid;
static const unsigned char sOutside;
static const unsigned char sInside;
//(41 more ...)
}
Run Code Online (Sandbox Code Playgroud)
的.cpp
const unsigned char MyClass::sInvalid = 0;
const unsigned char MyClass::sOutside = 1;
const unsigned char MyClass::sInside = 2;
//and so on
Run Code Online (Sandbox Code Playgroud)
在某些时候,我想在交换机中使用这些值,如:
unsigned char value;
...
switch(value) {
case MyClass::sInvalid : /*Do some ;*/ break;
case MyClass::sOutside : /*Do some ;*/ break;
...
}
Run Code Online (Sandbox Code Playgroud)
但是我得到以下编译器错误:错误:'MyClass :: sInvalid'不能出现在常量表达式中.
我已经阅读了其他开关 - 不能出现常量的东西,并没有找到我的答案,因为我不明白为什么那些static const unsigned char不是常量表达.
我正在使用gcc 4.5.
jpa*_*cek 18
你看到的问题是由于这个事实
static const unsigned char sInvalid;
Run Code Online (Sandbox Code Playgroud)
不能是编译时常量表达式,因为编译器不知道它的值.像这样在标题中初始化它们:
class MyClass : public MyBase
{
public:
static const unsigned char sInvalid = 0;
...
Run Code Online (Sandbox Code Playgroud)
它会起作用.
值确实是const,但它们不是编译时常量.
一个switch条件在编译时得到解决,而不是运行时.您可以初始化sInvalid为任何值,只要它只有一次,并且switch直到运行时才会知道它.
看起来你更喜欢使用enums而不是static常量.除了它可以工作的事实,它似乎更适合设计.
| 归档时间: |
|
| 查看次数: |
10726 次 |
| 最近记录: |