假设我们有一个枚举,如下所示:

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};

我想创建这个枚举的一个实例,并初始化它与一个适当的值,所以我做:

Days day = Days.Saturday;

现在我想用一个现有的enum值检查我的变量或实例,所以我这样做:

if (day == Days.Saturday)
{
    std::cout << "Ok its Saturday";
}

这给了我一个编译错误:

错误:在`之前期望主表达式。“令牌

所以要明确的是,这两者的区别是什么

if (day == Days.Saturday) // Causes compilation error

and

if (day == Saturday)

?

这两个实际上指的是什么,一个是OK,一个导致编译错误?


当前回答

这段代码是错误的:

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Days.Saturday;
if (day == Days.Saturday)

因为Days既不是作用域,也不是对象。它是一种类型。类型本身没有成员。你所写的等价于std::string.clear。string是一种类型,所以不能使用。在上面。你用。在类的实例上。

不幸的是,枚举是神奇的,所以类比就到此为止了。因为对于类,你可以使用std::string::clear来获取成员函数的指针,但在c++ 03中,Days::Sunday是无效的。(这很可悲)。这是因为c++与C(在某种程度上)向后兼容,而C没有名称空间,因此枚举必须在全局名称空间中。语法很简单:

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday)

幸运的是,Mike Seymour发现c++ 11已经解决了这个问题。将enum更改为enum类,它将获得自己的作用域;所以Days::Sunday不仅有效,而且是访问Sunday的唯一方法。快乐的日子!

其他回答

您正在寻找强类型枚举,这是c++ 11标准中提供的一个特性。它将枚举转换为具有作用域值的类。

使用您自己的代码示例,它是:

  enum class Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday};
  Days day = Days::Saturday;

  if (day == Days::Saturday)  {
    cout << " Today is Saturday !" << endl;
  }
  //int day2 = Days::Sunday; // Error! invalid

如果目标是c++ 11之前的c++标准,则使用::作为枚举的访问器将失败。但一些旧的编译器不支持它,以及一些ide只是覆盖这个选项,并设置一个旧的c++ std。

如果您正在使用GCC,请使用-std=c++11或-std=gnu11启用C+11。

这段代码是错误的:

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Days.Saturday;
if (day == Days.Saturday)

因为Days既不是作用域,也不是对象。它是一种类型。类型本身没有成员。你所写的等价于std::string.clear。string是一种类型,所以不能使用。在上面。你用。在类的实例上。

不幸的是,枚举是神奇的,所以类比就到此为止了。因为对于类,你可以使用std::string::clear来获取成员函数的指针,但在c++ 03中,Days::Sunday是无效的。(这很可悲)。这是因为c++与C(在某种程度上)向后兼容,而C没有名称空间,因此枚举必须在全局名称空间中。语法很简单:

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday)

幸运的是,Mike Seymour发现c++ 11已经解决了这个问题。将enum更改为enum类,它将获得自己的作用域;所以Days::Sunday不仅有效,而且是访问Sunday的唯一方法。快乐的日子!

不要把enum看成一组对象,把它看成一个整数,其中每个数值都有一个名称,所以enum Days最好声明为enum Day。 如果你想把它包含在一个命名结构中,把enum Day放在一个结构Days中,就像这样:

struct Days{
    enum Day{
        Saturday,
        Sunday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday
    };
};

然后您可以像这样称呼它们Days::Saturday,类型为Days::Day

首先,让“E”在enum中,“E”为小写。

其次,在“Days. saturday”中输入名称“Days”。

第三……给自己买一本好的c++书。

这将足以声明你的enum变量并进行比较:

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday) {
    std::cout << "Ok its Saturday";
}