在模板参数中转发声明枚举类?

时间:2017-04-05 11:42:14

标签: c++

我想在模板参数中转发声明一个强类型枚举(枚举类)。如果它已经定义,它就不起作用,因为强类型的枚举不能被" enum class"引用。

我想这样做,因为文件2可能不知道枚举定义。我该如何解决这个问题?

编译:

// File 1
template<typename TEnum>
class TSomeClass
{
    int m_someMember;
};

// File 2
struct MyStruct
{
    TSomeClass<enum class MyEnum : int> someClassInstance;
};

enum class MyEnum : int
{
    someIdentifier
};

不编译:

// File 1
template<typename TEnum>
class TSomeClass
{
    int m_someMember;
};

enum class MyEnum : int
{
    someIdentifier
};

// File 2
struct MyStruct
{
    TSomeClass<enum class MyEnum : int> someClassInstance;
                  //^ error: "reference to scoped enumeration must use 'enum' not 'enum class'"
};

不编译:

// File 1
template<typename TEnum>
class TSomeClass
{
    int m_someMember;
};

// File 2
struct MyStruct
{
    TSomeClass<enum MyEnum : int> someClassInstance;
};

enum class MyEnum : int
         //^ error: "enumeration previously declared as unscoped"
{
    someIdentifier
};

作为补充说明,它似乎适用于Visual Studio 2015。 但是,Clang 4.0.0给了我&#34;对范围枚举的引用必须使用&#39; enum&#39;没有&#39; enum class&#39;&#34;

编辑:我正在搜索枚举的常规前向声明(可能在模板参数之外)的替代方法。 结构/类的前向声明在模板参数内工作正常,为什么它们不能用于&#34; enum class&#34;?

1 个答案:

答案 0 :(得分:0)

您可以先转发枚举声明:

enum class MyEnum : int;

struct MyStruct
{
    TSomeClass<MyEnum> someClassInstance;
};