2017-04-04 88 views
1

爲什麼以下C++ 11/14代碼不起作用?在這裏,我正在向班內宣佈一個枚舉。目標不是在課堂上有100多個枚舉值 - 這使得課程無法讀取。出於政治原因,我無法爲此使用單獨的範圍枚舉。在課堂上抱怨私信

class A { 
public: 
    // forward declare the enum 
    enum B : int; 
    void func (B b) {} 
}; 

// The actual declaration 
enum A::B : int { 
    Val1, 
    Val2, 
}; 

int main() 
{ 
    // B is unscoped. so I should be able to use it as below? 
    int a = A::Val1; 
} 

編譯錯誤

tmp.cpp: In function ‘int main()’: 
tmp.cpp:13:5: error: ‘A::B Val1’ is private 
    Val1, 
    ^

tmp.cpp:19:16: error: within this context 
    int a = A::Val1; 
       ^

但是,下面的代碼工作:將出現在G中

int a = A::B::Val1; 
+0

只是一個想法:也許是因爲編譯器無法知道'Val1'不超過一個枚舉在A'的'的範圍內聲明的或派生階級 - 並通過強制它成爲私人來防止這種可能性。 – Jeremy

回答

0

該錯誤++而不是在Visual C++和鏗鏘。形式上枚舉的id可以用作命名空間,或者可以跳過,但最後兩個默認跳過它,而最新的g ++強制執行它。這可以通過編譯器選項來改變。枚舉類使用ID是必需的:

class A { 
public: 
    // forward declare the enum 
    enum class B : int; 
    void func (B b) {} 
}; 

// The actual declaration 
enum class A::B : int { 
    Val1, 
    Val2, 
}; 

int main() 
{ 
    int a = static_cast<int>(A::B::Val1); // no implicit cast 
} 
+0

我可能沒有完全得到你的答案。 'int a = A :: B :: Val1;'沒有強制轉換。只有'int a = A :: Val1;'不起作用。我期望它能像一個_unscoped枚舉一樣工作。 'int a = A :: Val1'工作正常,如果我把enum放在類本身中代替前向聲明的話。所以我的疑問是爲什麼這種行爲上的差異。 – MGH

+0

@MGH對於作爲範圍的enum類是強制性的,對於普通的枚舉,就像你使用的枚舉類型,它取決於編譯器的設置,爲什麼,我不確定。可能它被默認爲枚舉類?但不,這將需要演員。如果我沒有記錯,那麼帶有「寬容」標誌的g ++將允許這樣做。 – Swift