假设我们有enum以下内容:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
我想创建一个这样的实例enum并用适当的值初始化它,所以我做:
Days day = Days.Saturday;
现在我想用现有enum值检查我的变量或实例,所以我这样做:
if (day == Days.Saturday)
{
    std::cout << "Ok its Saturday";
}
这给了我一个编译错误:
错误:'.'之前的预期primary-expression 代币
所以要说清楚,说:有什么区别:
if (day == Days.Saturday) // Causes compilation error
和
if (day == Saturday)
?
这两个实际上是指什么,一个是好的,一个导致编译错误?
Moo*_*uck 326
这段代码错了:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Days.Saturday;
if (day == Days.Saturday)
因为Days不是范围,也不是对象.这是一种类型.而类型本身没有成员.你写的是相当于std::string.clear.  std::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 class它获得自己的范围; 所以Days::Sunday不仅有效,而且是唯一的访问方式Sunday.快乐的时光!
mat*_*975 24
这足以声明你的枚举变量并进行比较:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday) {
    std::cout << "Ok its Saturday";
}
pb2*_*b2q 22
其中大部分应该会给你编译错误.
// note the lower case enum keyword
enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
现在,Saturday,Sunday等可以被用作顶级裸常量和Days可以用作一个类型:
Days day = Saturday;   // Days.Saturday is an error
以后类似地测试:
if (day == Saturday)
    // ...
这些enum值就像裸常量一样 - 它们是un -scoped  - 只需要编译器的一些额外帮助:(除非你使用的是C++ 11 枚举类)它们不像对象或结构成员那样被封装,例如,你不能把它们称为成员的Days.
你会得到你正在寻找的C++ 11,它引入了enum class:
enum class Days
{
    SUNDAY,
    MONDAY,
    // ... etc.
}
// ...
if (day == Days::SUNDAY)
    // ...
请注意,这个C++在几个方面与C略有不同,一个是C enum在声明变量时需要使用关键字:
// day declaration in C:
enum Days day = Saturday;
小智 11
您可以根据需要使用技巧来使用范围,只需以这种方式声明枚举:
struct Days 
{
   enum type
   {
      Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday
   };
};
Days::type day = Days::Saturday;
if (day == Days::Saturday)
您正在寻找强类型枚举,这是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 ++标准的现有C ++ 11将失败。但是一些旧的编译器不支持它,一些 IDE 只是覆盖了这个选项,并设置了一个旧的 C++ 标准。
如果您使用 GCC,请使用-std=c++11或-std=gnu11启用 C+11 。
要开心!
枚举不是使用一堆if语句,而是适合切换语句
我在我为游戏构建的关卡生成器中使用了一些枚举/开关组合.
编辑:另一件事,我看到你想要语法类似;
if(day == Days.Saturday)
etc
你可以用C++做到这一点:
if(day == Days::Saturday)
etc
这是一个非常简单的例子:
EnumAppState.h
#ifndef ENUMAPPSTATE_H
#define ENUMAPPSTATE_H
enum eAppState
{
    STARTUP,
    EDIT,
    ZONECREATION,
    SHUTDOWN,
    NOCHANGE
};
#endif
Somefile.cpp
#include "EnumAppState.h"
eAppState state = eAppState::STARTUP;
switch(state)
{
case STARTUP:
    //Do stuff
    break;
case EDIT:
    //Do stuff
    break;
case ZONECREATION:
    //Do stuff
    break;
case SHUTDOWN:
    //Do stuff
    break;
case NOCHANGE:
    //Do stuff
    break;
}
这应该不适用于C++:
Days.Saturday
Days不是包含您可以使用点运算符访问的成员的范围或对象.这种语法只是一种C#主义,在C++中是不合法的.
Microsoft长期以来一直使用C++扩展,允许您使用范围运算符访问标识符:
enum E { A, B, C };
A;
E::B; // works with Microsoft's extension
但这在C++ 11之前是非标准的.在C++ 03中,枚举中声明的标识符仅存在于与枚举类型本身相同的范围内.
A;
E::B; // error in C++03
C++ 11使得使用枚举名称限定枚举标识符是合法的,并且还引入了枚举类,这些枚举类为标识符创建了新的范围,而不是将它们放在周围的范围中.
A;
E::B; // legal in C++11
enum class F { A, B, C };
A; // error
F::B;
如果您仍在使用C++ 03并且想要使用枚举,那么您应该在命名空间中使用枚举.例如:
namespace Daysofweek{
enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday};
}
您可以在命名空间外使用枚举,如,
Daysofweek::Days day = Daysofweek::Saturday;
if (day == Daysofweek::Saturday)
{
    std::cout<<"Ok its Saturday";
}
可悲的是,枚举的元素是“全局的”。您可以通过执行访问它们day = Saturday。这意味着你不能拥有enum A { a, b } ;,enum B { b, a } ;因为它们是冲突的。