1

标题说明了一切,但我在这里举一个例子:

class A {
public:
  enum A 
  {
    enumVal1,
    enumVal2
  };

  enum B 
  {
    enumVal1,
    enumVal3,
  };
};

我该怎么做才能起作用?

提前致谢。

4

3 回答 3

4

C++ 不允许您在同一范围内拥有两个相同的标识符。您可以添加一个前缀以使其清楚:

  enum A 
  {
    A_enumVal1,
    A_enumVal2
  };

  enum B 
  {
    B_enumVal1,
    B_enumVal3
  };

或者您可以将每个枚举放在不同的命名空间中并使用A::enumVal1,B::enumVal1等。命名空间旨在解决此类问题。

于 2013-08-08T10:57:02.343 回答
4

c++ 11你可以使用enum class

class MyClass {
public:
  enum class A 
  {
    enumVal1,
    enumVal2
  };

  enum class B 
  {
    enumVal1,
    enumVal3,
  };
};

比您将值引用为:

MyClass::A::enumVal1
MyClass::B::enumVal1

使用enum classes而不是旧枚举也可以为您提供强类型。你可以在这里阅读更多enum classes

于 2013-08-08T11:00:55.970 回答
1

C++11 有范围枚举:

class S {
public:
  enum class A 
  {
    enumVal1,
    enumVal2
  };

  enum class B 
  {
    enumVal1,
    enumVal3,
  };
};

然后你需要参考A::enumVal1and B::enumVal1enumVal2即使没有歧义,也必须是合格的。此外,枚举器不会int像旧样式那样隐式转换。你需要一个static_cast.

这只是具体化一个 C++03 习语:

class S {
public:
  struct A { enum type
  {
    enumVal1,
    enumVal2
  } value; };

  struct B { enum type 
  {
    enumVal1,
    enumVal3,
  } value; };
};

然后您需要声明 and 类型的对象A::type,或者B::type引用.value. struct A(其他方法也是可能的。)

于 2013-08-08T11:04:14.590 回答