如何访问封装在类中的未命名“枚举类”?

问题描述 投票:0回答:2
class A {
  public: enum class { HELLO, WORLD };
};

知道在

class
内部,声明一个简单的
enum
(而不是
enum class
)是一个更好的主意,因为它已经使用
class
标识进行了键入。但上面的声明仍然是有效的
C++0x
签名。现在如何访问外部未命名的
enum class

int i = A::HELLO; // error: ‘HELLO’ is not a member of ‘A’
c++ class enums c++11
2个回答
11
投票

实际上,这是无效的。 C++0x FDIS 说 (9.2p1)

除非用于声明友元 (11.3) 或将基类成员的名称引入派生类 (7.3.3),成员声明声明类的成员,并且每个此类成员声明应在类的至少一个成员名称。

在您的情况下,类的作用域中没有引入枚举器名称,也没有引入枚举名称。因此,该成员声明根本没有引入任何成员名称。

编辑:实际上,对枚举声明有更直接的禁止。 7.2p2:

在作用域枚举的声明中不得省略可选的 identifier


0
投票

虽然超出了原始问题的范围,但我想指出这在 C++20 中是可能的。

虽然作用域枚举仍然必须命名,但您可以使用占位符名称并将其设为

private
,然后在
public
部分中“导入”枚举器名称:

class A {
  private: enum class _ { HELLO, WORLD };
  public:  using enum _;
};

链接:

© www.soinside.com 2019 - 2024. All rights reserved.