c++ - 关于强类型枚举前向声明

标签 c++ c++11 enums nested forward-declaration

我的命名空间中有一组类,并且希望将前向声明分组到 Define.hpp 文件中。

我已经在其他项目中实现了这一点,这是一个示例:

namespace Makefile
{
    class Builder;
    class Config;
    class Options;
    class Target;
    class Tool;
}

我的问题是 - 例如 - Config 类包含以下强类型枚举:

namespace Makefile
{
    class Config
    {   
    public:
    enum class OperatingSystem : unsigned int 
        {   
            MacOSX = 0,
            Linux = 1,
            Windows = 2 
        };  
    };
}

所以我想在我的前向声明文件中添加这个枚举类,并添加以下行:

enum class Config::OperatingSystem : unsigned int;

我的问题来了,编译时出现以下错误:

src/Makefile/define.hpp:6:13: error: opaque-enum-specifier must use a simple identifier

这是否意味着无法前向声明嵌套类型? 这个问题有什么解决办法吗? 这是由于我的编译器造成的吗?

我的配置:Mac OS X.7 上的 GCC 4.6.0

编译标志:--std=c++0x -g3 -gdwarf-2 -W -Wall -iquote gen -iquote src

最佳答案

您只需在通常的位置创建不透明枚举即可:

namespace Makefile
{
    class Config
    {   
    public:
    enum class OperatingSystem : unsigned int;
    };
}

然后,无论您想在何处定义枚举常量:

namespace Makefile
{
    enum Config::OperatingSystem : unsigned int
    {   
        MacOSX = 0,
        Linux = 1,
        Windows = 2 
    };
}

错误opaque-enum-specifier必须使用简单标识符是告诉您,如果您需要使用简单标识符以外的其他方式引用枚举,那么您就做错了。

更新: 根据您的特定需求,您可以简单地在类外部声明枚举,或者在仅包含不透明枚举的简单类中声明枚举,并从中继承 Config :

namespace Makefile
{
    class ConfigDecl
    {
     public:
        enum class OperatingSystem : unsigned int;
    };
    class Config : public ConfigDecl;
}

关于c++ - 关于强类型枚举前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7698775/

相关文章:

c++ - 尝试删除初始化列表构造函数并不总是有效

c++ - 3和最接近,带有错误: expected unqualified-id before string constant

c++ - 数组索引时的枚举类性能

java - Gson 使用通用代码将枚举序列化和反序列化为整数

C++:type_info 区分类型

c++ - 实用和高级的 C++ 用法

c++ - 异步函数错误

c++ - 使用 boost 查找数据集的峰度

c++ - 如何将通用 packaged_tasks 存储在容器中?

c# - 如何将枚举泛型类型的变量转换为 int 并返回