在类访问混淆内声明的枚举类型

时间:2018-07-26 07:23:32

标签: c++ class c++11 enums

在下面的MyClass中,enum MyType是在类内部定义的。

主要,我创建一个变量MyClass::MyType t。这样编译就可以了。但是,当我希望为其分配诸如OPEN的值时,会出现编译错误“在此范围内未声明OPEN”

首先,在类内声明一个枚举类型并在其中限制其范围,然后在其他地方创建该枚举类型的变量可能没有任何意义,但我只是想了解发生了什么。

首先,当还没有创建对象时,如何在main中创建变量MyType?是否在此类隐式静态的类中定义了枚举和结构类型?

此外,编译器有权访问枚举代码,所以为什么它不理解“ OPEN”?谢谢

#include <iostream>

using namespace std;

class MyClass
{
    public:

        enum MyType
        {
            OPEN,
            CLOSED
        };

        struct MyStruct
        {
            int val1;
            int val2;
        };
};

int main()
{
    MyClass::MyType t;
    t = OPEN; // compilation error

    return 0;
}

4 个答案:

答案 0 :(得分:1)

就像雷米说的那样。值OPENMyClass类的一部分,并且只能在该类范围内访问。为了使您的编译器能够看到并使用它,您需要通过MyClass::OPEN进行访问。

答案 1 :(得分:1)

您的枚举MyType在类的内部,因此希望通过类访问其值。您已经在创建MyType而不实例化该类,但是还提供了一个通过该类实例化的示例。

class MyClass
{
    public:

    enum MyType
    {
        OPEN,
        CLOSED
    };

    struct MyStruct
    {
        int val1;
        int val2;
    };
};

int main()
{
    MyClass::MyType t; // Already a MyType value!
    MyClass c; // Building your class

    t = MyClass::MyType::OPEN; // No compilation error
    t = c.OPEN; // Accessing enum through instantiated class

    return 0;
}

答案 2 :(得分:1)

(除了其他人写的东西)

如果编译器支持(自C ++ 11开始), 最好使用enum class

enum class MyType
{
    OPEN,
    CLOSED
};

“枚举类(“新枚举”,“强枚举”)解决了传统C ++枚举的三个问题:

1)常规枚举隐式转换为整数,当某人不希望枚举充当整数时会导致错误。

2)常规枚举将其枚举数导出到周围的范围,导致名称冲突。

3)枚举的基础类型无法指定,从而导致混乱,兼容性问题,并使前向声明变得不可能。”

ISOCPP FAQ - enum class

-

在这种情况下,请使用以下语法:

int main()
{
    MyClass c;
    MyClass::MyType t;
    t = MyClass::MyType::OPEN;

    return 0;
}

答案 3 :(得分:0)

See [decl.enum]/11

  

每个enum-name和每个未作用域的枚举器都在作用域中声明   立即包含enum-specifier。每个作用域枚举器   在枚举范围内声明。这些名称服从   为[basic.scope]和[basic.lookup]中的所有名称定义的范围规则。   [示例:

enum direction { left='l', right='r' };

void g()  {
  direction d;                  // OK
  d = left;                     // OK
  d = direction::right;         // OK
}

enum class altitude { high='h', low='l' };

void h()  {
  altitude a;                   // OK
  a = high;                     // error: high not in scope
  a = altitude::low;            // OK
}
     

-“ end example”]可以引用在类范围中声明的枚举数   使用类成员访问运算符(:::,。(点)和->   (箭头)),请参见[expr.ref]。 [示例:

struct X {
  enum direction { left='l', right='r' };
  int f(int i) { return i==left ? 0 : i==right ? 1 : 2; }
};

void g(X* p) {
  direction d;                  // error: direction not in scope
  int i;
  i = p->f(left);               // error: left not in scope
  i = p->f(X::right);           // OK
  i = p->f(p->left);            // OK
  // ...
}
     

-示例]