假设我们有一个enum类似的内容:
enum
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
我想创建一个实例enum并用适当的值初始化它,所以我这样做:
Days day = Days.Saturday;
现在我想用现有enum值检查我的变量或实例,所以我这样做:
if (day == Days.Saturday) { std::cout << "Ok its Saturday"; }
这给了我一个编译错误:
错误:“。”标记之前的预期主表达式
所以要清楚,说之间有什么区别:
if (day == Days.Saturday) // Causes compilation error
和
if (day == Saturday)
?
这两个实际上指的是什么,一个是可以的,一个会导致编译错误?
这段代码是错误的:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday}; Days day = Days.Saturday; if (day == Days.Saturday)
因为Days不是范围,也不是对象。它是一种类型。并且类型本身没有成员。你写的相当于std::string.clear. std::string是一种类型,所以你不能.在它上面使用。您.在类的 实例 上使用。
Days
std::string.clear
std::string
.
不幸的是,枚举是神奇的,所以类比到此为止。因为有了一个类,你可以做得到std::string::clear一个指向成员函数的指针,但是在C03中,Days::Sunday是无效的。(这是可悲的)。这是因为 C(在某种程度上)与 C 向后兼容,并且 C 没有命名空间,因此枚举必须在全局命名空间中。所以语法很简单:
std::string::clear
Days::Sunday
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday}; Days day = Saturday; if (day == Saturday)
幸运的是,发现这已在C++11 中得到解决。更改enum为enum class并获得自己的范围;soDays::Sunday不仅有效,而且 _是_访问Sunday. 快乐的时光!
enum class
Sunday