枚举前置声明

10

我正在尝试正确使用枚举的前向声明。因此,我搜索了互联网,但找不到有效的解决方法。

我在头文件中使用了以下内容:

// Forward declaration
enum myEnumProcessState;

我随后在一个结构体中使用了这个枚举:

struct myStruct {
    [...]
    myEnumProcessState osState;
    [...]
};

并在另一个标题中:

enum myEnumProcessState {
    eNotRunning,
    eRunning
};

我发现应该在枚举类型的前向声明中加入类型才能被接受。然而,我不知道对于进程状态应该放哪种“类型”。以下这些都不起作用:

enum myEnumProcessState : unsigned int;
enum myEnumProcessState : String;

我想跳过前向声明,但是我的 struct 现在找不到它了,很难过...

所以我有点困惑。有解决方案吗?


为什么需要前向声明?你不能在使用之前定义它吗(也就是说,包含具有枚举的文件/将枚举移动到可以被两个文件都包含的文件中)? - default
嗯...它确实有效。但是我真的希望能用前向声明来完成它。 现在,如果唯一的“干净”解决方案是跳过它,那我就会这样做... - user2069871
我其实不知道是否有解决方案,但我无法理解为什么您想要这样做的原因。 - default
1个回答

19
在C++11之前,C++根本不支持枚举的前向声明!然而,一些编译器(如MS Visual Studio)提供了语言扩展来实现这一点。
如果您的编译器不支持C++11,请查看其关于枚举前向声明的文档。
如果您可以使用C++11,则有enum class语法(您几乎做对了,但要注意额外的class关键字:
// Forward declaration
enum class myEnumProcessState: unsigned int;

// Usage in a struct
struct myStruct {myEnumProcessState osState;};

// Full declaration in another header
enum class myEnumProcessState: unsigned int {
    eNotRunning,
    eRunning
};

// Usage of symbols (syntax may seem slightly unusual)
if (myObject.osState == myEnumProcessState::eNotRunning) {
    ...
}

嗯,当我输入这个时,出现了一个错误:“在行上预期'{'之前的';'标记”“枚举类myEnumProcessState:unsigned int;” - user2069871
看起来你的编译器支持c++03但不支持c++11。在c++03中,枚举类型的前向声明是不被支持的,但有些编译器会作为语言扩展来支持它们(是否应该使用这些扩展是另一个问题)。 - anatolyg
这是G++ 4.7.2,我以为它默认遵循C++11标准。难道不是吗? - user2069871
3
好的,没问题。将"-std=c++11"添加后,代码现在可以运行了。 - user2069871
1
不一定需要使用enum class,也不总是理想的选择。只要指定了基础类型,普通的enum就可以进行前向声明。话虽如此,具体细节目前还不太清楚。你可能会认为,如果没有显式指定基础类型,那么一个普通的枚举声明将会得到int,但我却得到了一个“类型不匹配”的错误……它并没有友好地告诉我原始未命名声明所指定的类型是什么。 :S 可以推测,在完整和前向声明处都明确指定基础类型是最安全/必需的。 - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接