猿问

转发在C ++中声明一个枚举

转发在C ++中声明一个枚举

我正在尝试做类似以下的事情:

enum E;void Foo(E e);enum E {A, B, C};

编译器拒绝的。我已经快速浏览了一下Google,而且共识似乎是“你做不到”,但我无法理解为什么。谁能解释一下?

澄清2:我这样做是因为我在类中使用私有方法来获取枚举,并且我不希望枚举枚举值 - 例如,我不希望任何人知道E被定义为

enum E {
    FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X}

因为项目X不是我希望用户了解的东西。

所以,我想转发声明枚举,以便我可以将私有方法放在头文件中,在cpp内部声明枚举,并将构建的库文件和标题分发给人。

至于编译器 - 它是GCC。


12345678_0001
浏览 555回答 3
3回答

慕妹3242003

在C ++ 0x中也可以进行枚举的前向声明。以前,枚举类型无法向前声明的原因是因为枚举的大小取决于其内容。只要枚举的大小由应用程序指定,就可以向前声明:enum Enum1;                   //Illegal in C++ and C++0x; no size is explicitly specified.enum Enum2 : unsigned int;    //Legal in C++0x.enum class Enum3;             //Legal in C++0x, because enum class declarations have a default type of "int".enum class Enum4: unsigned int; //Legal C++0x.enum Enum2 : unsigned short;  //Illegal in C++0x, because Enum2 was previously declared with a different type.

慕田峪4524236

鉴于最近的发展,我在这里添加了一个最新的答案。您可以在C ++ 11中转发声明枚举,只要您同时声明其存储类型即可。语法如下所示:enum E : short;void foo(E e);....enum E : short{     VALUE_1,     VALUE_2,     ....}实际上,如果函数永远不会引用枚举的值,那么此时您根本不需要完整的声明。G ++ 4.6及更高版本(-std=c++0x或-std=c++11更新版本)支持此功能。Visual C ++ 2013支持这一点; 在早期版本中它有一些我尚未想到的非标准支持 - 我发现一些简单的前向声明是合法的,但是YMMV。
随时随地看视频慕课网APP
我要回答