C++11 类中的前向声明非作用域枚举抱怨私有

C++11 类中的前向声明非作用域枚举抱怨私有,c++11,enums,forward-declaration,C++11,Enums,Forward Declaration,为什么下面的c++11/14代码不起作用?这里我正向声明类中的枚举。目标是不要在类中有大量的100个枚举值,这会使类不可读。出于政治原因,我不能为此使用单独的作用域枚举 class A { public: // forward declare the enum enum B : int; void func (B b) {} }; // The actual declaration enum A::B : int { Val1, Val2, }; int mai

为什么下面的c++11/14代码不起作用?这里我正向声明类中的枚举。目标是不要在类中有大量的100个枚举值,这会使类不可读。出于政治原因,我不能为此使用单独的作用域枚举

class A {
public:
  // forward declare the enum
  enum B : int;
  void func (B b) {}
};

// The actual declaration
enum A::B  : int {
    Val1,
    Val2,
};

int main ()
{
    // B is unscoped. so I should be able to use it as below?
    int a = A::Val1;
}
编译错误 但以下代码是有效的:

int a = A::B::Val1;

<错误>出现在G++中,但不在VisualC++和CLAN中。形式上,enum的id可以用作名称空间,也可以跳过,但最后两个在默认情况下跳过它,而最新的g++强制执行它。这可以通过编译器选项进行更改。必须使用枚举类的id:

class A {
public:
  // forward declare the enum
  enum class B : int;
  void func (B b) {}
};

// The actual declaration
enum class A::B  : int {
    Val1,
    Val2,
};

int main ()
{
    int a = static_cast<int>(A::B::Val1); // no implicit cast
}
A类{
公众:
//向前声明枚举
枚举B类:int;
void func(B){}
};
//实际申报
枚举类A::B:int{
瓦尔1,
Val2,
};
int main()
{
int a=static_cast(a::B::Val1);//无隐式cast
}

<错误>出现在G++中,但不在VisualC++和CLANG中。形式上,enum的id可以用作名称空间,也可以跳过,但最后两个在默认情况下跳过它,而最新的g++强制执行它。这可以通过编译器选项进行更改。必须使用枚举类的id:

class A {
public:
  // forward declare the enum
  enum class B : int;
  void func (B b) {}
};

// The actual declaration
enum class A::B  : int {
    Val1,
    Val2,
};

int main ()
{
    int a = static_cast<int>(A::B::Val1); // no implicit cast
}
A类{
公众:
//向前声明枚举
枚举B类:int;
void func(B){}
};
//实际申报
枚举类A::B:int{
瓦尔1,
Val2,
};
int main()
{
int a=static_cast(a::B::Val1);//无隐式cast
}

只是一个想法:可能是因为编译器不知道
a
或派生类范围内的
Val1
没有在多个枚举中声明,并通过强制它是私有的来防止这种可能性。只是一个想法:可能是因为编译器不知道
Val1
没有在
A
或派生类范围内有多个枚举-并通过强制其为私有来防止这种可能性。我可能没有完全得到您的答案<代码>int a=a::B::Val1无需强制转换即可工作。只有
inta=a::Val1不起作用。我希望它能作为一个无范围的枚举工作
inta=a::Val1
如果我将枚举放在类本身中而不是前向声明中,则效果很好。所以我的疑问是,为什么会有这种行为上的差异。@MGH对于作用域为的枚举类是强制性的,对于像您使用的一个普通枚举,它取决于编译器的设置,为什么,我不确定。默认情况下是否可以将其视为枚举类?但不,那需要演员阵容。如果我没记错的话,带有“permissive”标志的g++将允许这样做。我可能没有完全得到你的答案<代码>int a=a::B::Val1无需强制转换即可工作。只有
inta=a::Val1不起作用。我希望它能作为一个无范围的枚举工作
inta=a::Val1
如果我将枚举放在类本身中而不是前向声明中,则效果很好。所以我的疑问是,为什么会有这种行为上的差异。@MGH对于作用域为的枚举类是强制性的,对于像您使用的一个普通枚举,它取决于编译器的设置,为什么,我不确定。默认情况下是否可以将其视为枚举类?但不,那需要演员阵容。如果我没记错的话,带有“permissive”标志的g++将允许这样做。