C ++:如何在声明它的模板类主体之外定义一个枚举类?

时间:2018-09-09 14:17:40

标签: c++ templates enums nested forward-declaration

我有一些采用以下形式的C ++代码:

template <typename type>
class foo
{
    type a;
    class bar;
};

template <typename type>
class foo<type>::bar
{
    enum class baz;
};

template <typename type>
enum class foo<type>::bar::baz
{
    val1,
    val2
};

使用此代码,我试图使foo :: bar中的方法可以访问该枚举类,并能够存储该枚举类类型的数据。枚举类也不是模板类型-枚举类的枚举数是整数/枚举类的默认类型。

但是,当我编译这是MinGW / Code :: Blocks时,这似乎会产生两个错误消息,都在行上:

enum class foo<type>::bar::baz
  

错误:“枚举baz”的模板声明

     

错误:foo :: bar尚未声明

1 个答案:

答案 0 :(得分:2)

我认为这几乎可以肯定是编译器错误。基于temp.mem.classtemp.mem.enum,我想这肯定是有效的C ++。 clang和icc似乎都可以编译此代码。但是,GCC(MinGW基本上是GCC)以及MSVC显然无法对此进行编译。似乎两个编译器(即使在最新版本中)都错误地将此类对类模板的枚举成员的定义误认为是试图声明一个枚举模板(这确实是非法的)……

quick test here

编辑:对于MSVC,似乎已经存在一个未解决的问题here