代码之家  ›  专栏  ›  技术社区  ›  Engineer999

类访问混乱中声明的枚举类型

  •  1
  • Engineer999  · 技术社区  · 6 年前

    MyClass 下面, enum MyType 在类内定义。

    总的来说,我创建了一个变量 MyClass::MyType t . 这汇编得很好。但是,当我希望给它赋一个值(如open)时,出现一个编译错误“open was not declared in this scope”。

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

    首先,我如何创建一个变量 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 回复  |  直到 6 年前
        1
  •  1
  •   Luis Condes    6 年前

    您的枚举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
  •   Filip Skrinjar    6 年前

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

        3
  •  1
  •   Amit G.    6 年前

    (除了其他人写的以外)

    如果编译器支持(因为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;
    }
    
        4
  •  0
  •   Swordfish    6 年前

    See [decl.enum]/11 :

    在作用域中声明每个枚举名称和每个非范围枚举器 立即包含枚举说明符的。每个作用域枚举器 在枚举范围内声明。这些名字符合 为[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]可以引用类作用域中声明的枚举器 使用类成员访问运算符(::,。(DOT)和-GT; (箭头)),请参见[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
      // ...
    }
    

    结束示例