2017-08-14 164 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; 
}