2017-08-14 81 views
-5

我對着C++中的問題:C++如何訪問內部枚舉類?

#include <iostream> 
class Apple{ 
public: 
    int price = 100; 
    enum class color { 
    red =1, green, yellow 
    }; 



}; 
int main() { 
Apple apple; 
std::cout << Apple::color::green << std::endl; 

} 

當我嘗試編譯這段代碼顯示以下消息:

[錯誤]「蘋果::彩」是不是類或命名空間

+4

您正在使用哪種版本的C++? Enum類由C++ 11支持。當我運行你的例子時,它給了我一個「no operator」<<「匹配這些操作數」的錯誤。 (在VS15 - vc140) – pvl

+1

這不是問題,但是你真的需要'std :: endl'做的額外的東西嗎? ''\ n''結束一行。 –

回答

-1

P0W的答案是在這兩方面是正確的,但如果你只是想要輸出基礎值,那麼可能更簡單,而不是重載插入操作符。

using enum_type = std::underlying_type<Apple::color>::type; 
enum_type value = (enum_type)Apple::color::green; 
std::cout << value << '\n'; 
+0

你可以在我的例子 – kim366

+1

@ kim366中至少使用'static_cast'而不是C-style cast,但我也不必這樣做。我發現C風格的演員陣容更容易閱讀,並且考慮到上下文,沒有機會誤解轉換類型。 – user2079303

4
  1. 看起來好像您正在使用的是pre C++ 11編譯器或C++ 11標誌未啓用。
  2. 使用正確的C++ 11標誌後,你將不得不超負荷operator <<

    friend std::ostream& operator <<(std::ostream& os, const color& c) 
    { 
        /* ... */ 
        return os; 
    } 
    
0

爲了使用enum class你的編譯器,支持C++ 11。這可以通過在clang或g ++ build命令之後追加-std=c++11(如果使用這些命令)來實現。新版本的Visual Studio會自動啓用C++ 11。

您應該得到的錯誤是no operator "<<,正如@pvl指出的那樣,因爲enum class不會隱式轉換爲任何內容,因此不會輸出整數值。

+1

轉換總是顯式的 - 這是您在源代碼中編寫的內容,以告知編譯器進行轉換。問題是沒有**隱式轉換**。 –

+0

謝謝,我會記住 – kim366

0
  • 啓用c++11原因enum class是一個C++ 11特徵起訴 - std=c++11編譯器標誌。

  • 超載的<<運營商如果要coutApple::color

類似下面應該工作:

#include <iostream> 

class Apple { 
public: 
    int price = 100; 
    enum class color { red = 1, green, yellow }; 
}; 

std::ostream& operator<<(std::ostream& os, const Apple::color& c) { 
    if (c == Apple::color::red) std::cout << "Red\n"; 
    if (c == Apple::color::green) std::cout << "Green\n"; 
    if (c == Apple::color::yellow) std::cout << "Yellow\n"; 
    return os; 
} 

int main() { 
    Apple apple; 
    std::cout << Apple::color::green << std::endl; 
}