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

C++: How to define an enum class outside of a template class body in which it is declared?

我有一些采用以下形式的 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
};

使用这段代码,我试图让枚举 class 可以通过 foo::bar 中的方法访问,并能够存储此枚举类型的数据 class.枚举 class 也不意味着是模板类型 - 枚举 class 枚举器是 integers/the 枚举 class.

的默认类型

然而,当我编译这个 MinGW/Code::Blocks 时,这似乎产生了两条错误消息,都在线:

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

error: template declaration of 'enum baz'

error: foo<type>::bar has not been declared

我认为这几乎可以肯定是编译器错误。基于 temp.mem.class and temp.mem.enum,我认为这绝对应该是有效的 C++。 clang 和 icc 似乎都能很好地编译这段代码。然而,GCC(MinGW 基本上就是 GCC)和 MSVC 显然无法编译它。似乎两个编译器(即使在最新版本中)都将 class 模板的枚举成员的定义误认为是试图声明一个枚举模板(这确实是非法的)......

quick test here

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