2011-11-08 64 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?

相關問題