【问题标题】:Forward declaring enum class inside template parameter?在模板参数中转发声明枚举类?
【发布时间】:2017-04-05 11:42:14
【问题描述】:

我想在模板参数中转发声明一个强类型枚举(枚举类)。如果它已经定义,则它不起作用,因为“枚举类”无法引用强类型枚举。

我想这样做是因为文件 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 给了我“对作用域枚举的引用必须使用 'enum' 而不是 'enum class'”

编辑:我正在寻找通常的枚举前向声明的替代方法(这将在模板参数之外)。 结构/类的前向声明在模板参数中工作正常,为什么它们不适用于“枚举类”?

【问题讨论】:

  • 为什么要在模板参数里面?!
  • 查看我对 Jarod42 的回复和我的编辑。

标签: c++


【解决方案1】:

你可以先转发枚举声明:

enum class MyEnum : int;

struct MyStruct
{
    TSomeClass<MyEnum> someClassInstance;
};

【讨论】:

  • 对不起,我忘了指定,但是这些枚举和结构是由工具自动生成的,而且数量很多,所以最简单的方法是在模板参数中转发声明它们。我正在寻找您提议的替代方案。
猜你喜欢
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2015-04-26
  • 2011-01-31
  • 1970-01-01
相关资源
最近更新 更多