C++ 如何访问内部枚举类?

C++ How can I access to an inner enum class?

本文关键字:内部 枚举 访问 何访问 C++      更新时间:2023-10-16

我在 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;
}

当我尝试编译此代码时,出现以下消息:

[错误] "Apple::color"不是类或命名空间

  1. 看起来您使用的是 C++11 之前的编译器或未启用 c++11 标志。
  2. 使用正确的 c++11 标志后,您将不得不重载operator <<

    friend std::ostream& operator <<( std::ostream& os, const color& c )
    {
    /* ... */
    return os;
    }
    
  • 启用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 << "Redn";
if (c == Apple::color::green) std::cout << "Greenn";
if (c == Apple::color::yellow) std::cout << "Yellown";
return os;
}
int main() {
Apple apple;
std::cout << Apple::color::green << std::endl;
}

为了使用enum class编译器必须支持C++11。例如,这可以通过在 clang 或 g++ build 命令(如果您正在使用这些命令(之后附加一个-std=c++11来实现。新版本的Visual Studio会自动启用C++11。

正如@pvl所指出的,您应该得到的错误是no operator "<<,因为enum class不会隐式转换为任何内容,因此不会输出整数值。

P0W 的答案在这两个方面都是正确的,但如果您只想输出基础值,那么强制转换而不是重载插入运算符可能更简单。

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