【问题标题】:Enum Forward Declaration [duplicate]枚举前向声明 [重复]
【发布时间】:2013-02-14 23:32:53
【问题描述】:

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

我在标题中使用它:

// Forward declaration
enum myEnumProcessState;

然后我在结构中使用这个枚举:

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

在另一个标题中:

enum myEnumProcessState {
    eNotRunning,
    eRunning
};

我发现类型应该放在枚举前向声明中才能被接受。但是,我不知道应该为流程状态输入哪种“类型”。这些不起作用:

enum myEnumProcessState : unsigned int;
enum myEnumProcessState : String;

我想跳过前向声明,但我的 struct 正在哭泣,因为它再也找不到它了...

所以我有点困惑。有解决办法吗?

【问题讨论】:

  • 为什么需要转发声明呢?你不能在使用它之前定义它(即包含具有枚举的文件/将枚举移动到两个文件都可以包含的文件)?
  • 嗯......它确实有效。但是,我真的很想通过前向声明来做到这一点。现在,如果唯一的“干净”解决方案是跳过它,我会...
  • 我实际上不知道是否有解决方案。但是我看不到您想要这样做的原因..

标签: c++ enums forward-declaration


【解决方案1】:

在 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) {
    ...
}

【讨论】:

  • 嗯。当我输入这个时,我得到一个“错误:在';'之前预期'{' ligne 上的令牌“枚举类 myEnumProcessState : unsigned int;” ...
  • 您的编译器似乎支持 c++03 但不支持 c++11。 c++03 不支持枚举的前向声明,但一些编译器确实支持它们作为语言扩展(您是否应该使用这些扩展是另一回事)。
  • 它是 G++ 4.7.2,我以为它默认遵循 C++11。不是吗?
  • 嗯......它没有。我添加了 -std=c++11,现在可以了
  • enum class 不是必需的,也不是总是可取的。只要指定了基础类型,就可以前向声明一个普通的enum。话虽如此,我目前还不清楚确切的细节。你会假设一个没有显式底层类型声明的普通枚举会得到int,但我得到一个“类型不匹配”错误......并不是说它足够好地告诉我它认为的类型 i> 我原来的无类型声明是指定的。 :S 据推测,在完整和前向声明站点显式指定底层类型是最安全/必需的。
猜你喜欢
  • 2011-11-20
  • 2010-09-09
  • 1970-01-01
  • 2023-03-27
  • 2010-10-31
  • 1970-01-01
相关资源
最近更新 更多