两个枚举有一些共同的元素,为什么会产生错误?

Pie*_*ter 32 c c++ enums

我的代码中有两个枚举:

enum Month {January, February, March, April, May, June, July,
        August, September, October, November, December};
enum ShortMonth {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
Run Code Online (Sandbox Code Playgroud)

May 是两个枚举中的常见元素,因此编译器说:

调查员的重新声明' May'.

为什么这么说呢?我怎么能绕过这个呢?

unw*_*ind 40

枚举名称在全球范围内,它们必须是唯一的.请记住,您不需要使用枚举名称限定枚举符号,您只需执行以下操作:

Month xmas = December;
Run Code Online (Sandbox Code Playgroud)

不:

Month xmas = Month.December;  /* This is not C. */
Run Code Online (Sandbox Code Playgroud)

出于这个原因,您经常会看到人们在符号名称前加上枚举名称:

enum Month { Month_January, Month_February, /* and so on */ };
Run Code Online (Sandbox Code Playgroud)

  • @SF:想象两个枚举:“颜色”和“水果”。“ Orange”的值是多少? (2认同)

Ale*_*own 29

我建议你合并两个:

enum Month {
  Jan, January=Jan, Feb, February=Feb, Mar, March=Mar, 
  Apr, April=Apr,   May,               Jun, June=Jun, 
  Jul, July=Jul,    Aug, August=Aug,   Sep, September=Sep, 
  Oct, October=Oct, Nov, November=Nov, Dec, December=Dec};
Run Code Online (Sandbox Code Playgroud)

哪个效果完全相同,更方便.

如果您希望January的值为1而不是0,请添加以下内容:

enum Month {
  Jan=1, January=Jan, Feb, February=Feb, ....
Run Code Online (Sandbox Code Playgroud)


Ale*_*tov 13

在C++中,为避免名称冲突,您可以将枚举包装到结构中:

struct Month { enum {January, February, March, April, May, June, July,
        August, September, October, November, December}; };
struct ShortMonth { enum {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}; };
Run Code Online (Sandbox Code Playgroud)

  • 或者使用“枚举类”甚至“命名空间” (4认同)
  • 是的,但主题启动者的问题也出现在C++中.所以我认为它对C++也很有用 - 人们也是如此.发布编辑以反映此更改. (3认同)

小智 7

什么放松说.但我还想说你的例子似乎是一个非常不寻常的使用枚举.我看不出让ShortMonth和LongMonth都指向同一个东西的价值 - 这对字符串有意义,但对于枚举则没有意义.为什么不只有一个月枚举类型?


Nat*_*ica 6

在 C++11 中,您可以使用作用域枚举来解决这个问题。这将从全局范围中删除名称并将它们范围限定为枚举名称。

enum class Identity
{
       UNKNOWN = 1,
       CHECKED = 2,
       UNCHECKED =3
};

enum class Status
{
       UNKNOWN = 0,
       PENDING = 1,
       APPROVED = 2,
       UNAPPROVED =3
};

int main ()
{
    Identity::UNKNOWN;
    Status::UNKNOW;
}
Run Code Online (Sandbox Code Playgroud)

Live Example