2011-11-08 62 views
14

我在switch语句中得到'case expression not constant'错误。但是,头文件为所使用的常量提供了一个定义,并且构造函数在其初始化列表中为它们提供了初始化。表达式不是常量

此外,当我将鼠标悬停在“问题”语句上时,它将它们标识为常量。

const int ThisClass::EXAMPLE_CONSTANT 

error expression must have a constant value 

这对我来说似乎有点违反直觉。我做了一些研究,发现了其他人的类似问题。他们被告知,所有的常量实际上必须以“主”的形式初始化,这是语言的限制。这是真的吗?这似乎不太可能。

+1

提供了演示该问题的实际代码。你粘贴的东西不是很有帮助。 – tenfour

+0

请发送验证码 – Heisenbug

+0

您使用的是哪种编译器?它真的是C++吗? – harper

回答

12

case语句需要积分值必须在编译知道这是什么意思常数这里。但const成员在这个意义上并不是常数。它们只是只读的。

取而代之的字段,你可以使用enum

class ThisClass 
{ 
    public: 

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

然后,你可以写,如果标签上使用必须整型常量表达式

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

如果常量不相关,我会建议使用未命名的枚举。 –

3

你需要一个“真正的”编译时间整数常量。 const在C++中表示只读,并且const变量 可以初始化,就像int y = 0; const int x = y;一样,使得x为初始化时的值为y的只读副本。

拥有现代化的编译器,您可以使用enum S或constexpr s到存储编译时间常量性(积分)成员:

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

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

'constexpr'不会使成员静态。 –

+0

@Martinho:固定。 –

1

常量。一个积分常量表达式必须满足更严格的一组要求,而不仅仅是一个被声明为const的整体对象。

非静态类成员不能用在整型常量表达式中,所以你试图做的事情不会编译。例如,如果静态类成员的初始化程序在使用点处“可见”,则可以将其用于整型常量表达式中。

1

这是一个混乱。在C++ const可用于几件事情,如声明实际常量,并声明只读变量。

如果声明:

const int x = 0; 

在全球命名空间,或局部范围,它是一个常数。您可以在需要常量表达式的情况下使用它(如案例标签或数组大小)。但是,在类作用域或作为函数参数时,它只是一个只读变量。

此外,如果您在声明类范围:

static const int x = 0; 

这也是一个常数。

+1

在函数作用域(即局部作用域)中声明并用一个整型常量表达式初始化的'const int'变量本身在C++中形成整型常量表达式。所以在函数范围内它不仅仅是一个“只读变量”。 – AnT

+0

@AndreyT oops,我的意思是函数参数:)谢谢。 –

0

std::map + C++ 11个lambda表达式变通方法

该方法允许用于非常量,应该给我们O(1)摊销What is the best way to use a HashMap in C++?

#include <ctime> 
#include <functional> 
#include <unordered_map> 
#include <iostream> 

int main() { 
    int result; 
    int key0 = std::time(NULL) % 3; 
    int key1 = (key0 + 1) % 3; 
    int key2 = (key0 + 2) % 3; 
    std::unordered_map<int,std::function<void()>> m{ 
     {key0, [&](){ result = 0; }}, 
     {key1, [&](){ result = 1; }}, 
     {key2, [&](){ result = 2; }}, 
    }; 
    m[key0](); 
    std::cout << key0 << " " << result << std::endl; 
    m[key1](); 
    std::cout << key1 << " " << result << std::endl; 
    m[key2](); 
    std::cout << key2 << " " << result << std::endl; 
} 

可能的输出:

1 0 
2 1 
0 2 

对于从班内使用,不要忘记建立地图楼梯如下所示:Why switch statement cannot be applied on strings?

相关问题