在下面的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;
}
答案 0 :(得分:1)
就像雷米说的那样。值OPEN
是MyClass
类的一部分,并且只能在该类范围内访问。为了使您的编译器能够看到并使用它,您需要通过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)枚举的基础类型无法指定,从而导致混乱,兼容性问题,并使前向声明变得不可能。”
-
在这种情况下,请使用以下语法:
int main()
{
MyClass c;
MyClass::MyType t;
t = MyClass::MyType::OPEN;
return 0;
}
答案 3 :(得分:0)
每个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 // ... }
-示例]