假设我们有一个 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)
?
这两个实际上指的是什么,一个是可以的,一个会导致编译错误?
原文由 Hossein 发布,翻译遵循 CC BY-SA 4.0 许可协议
这段代码是错误的:
因为
Days
不是范围,也不是对象。它是一种类型。并且类型本身没有成员。你写的相当于std::string.clear
。std::string
是一种类型,所以不能在其上使用.
。您在类的 实例 上使用.
。不幸的是,枚举是神奇的,所以类比到此为止。因为有了一个类,你可以做
std::string::clear
来获取一个指向成员函数的指针,但是在 C++03 中,Days::Sunday
是无效的。 (这是可悲的)。这是因为 C++(在某种程度上)与 C 向后兼容,并且 C 没有命名空间,因此枚举必须在全局命名空间中。所以语法很简单:幸运的是, Mike Seymour 发现这已在 C++11 中得到解决。将
enum
更改为enum class
并获得自己的范围;所以Days::Sunday
不仅有效,而且是访问Sunday
的 唯一 方法。快乐的时光!