普查员的范围

时间:2011-08-30 02:17:58

标签: c++ enums compiler-errors scope

在下文中,我不知道我是否在C#中使用C ++来混淆枚举,但是   我以为你只能使用Forms::shape来访问enum中的枚举器,这实际上会产生错误。

int main()
{
    enum Forms {shape, sphere, cylinder, polygon};

    Forms form1 = Forms::shape; // error
    Forms form2 = shape; //  ok
}

为什么在没有范围运算符的情况下允许在枚举之外访问shape以及如何防止此行为?

4 个答案:

答案 0 :(得分:5)

好吧,因为枚举不形成声明范围。这就是它在C ++中的方式。您希望将这些枚举常量封装在专用范围中,自己创建一个:使​​用包装类或命名空间。

即将推出的C ++标准将引入新的枚举,它确实产生了自己的范围。

答案 1 :(得分:1)

在您的示例中,枚举未在类中声明,因此它没有特定的范围。您可以定义一个结构 - 一个结构是一个所有成员在C ++中都是公共的类 - 包含您的枚举,并使用该类的名称来提供范围。

你也可以创建一个命名空间,并将你的枚举放在其中。但这可能有点矫枉过正。

答案 2 :(得分:0)

我建议潜在的原因来自C兼容性。

答案 3 :(得分:0)

C ++ 11引入了scoped enumerations,它可以保持命名空间的清晰,并防止与int类型的无意组合。使用关键字序列enum class声明范围内的枚举。

通过使用范围的枚举,您的上述示例将变为:

int main()
{
    enum class Forms {shape, sphere, cylinder, polygon}; // mind the "class" here

    Forms form1 = Forms::shape; // ok
    Forms form2 = shape;  // error
}