转发声明类模板的成员枚举

Tar*_*ral 8 c++ enums templates forward-declaration c++11

使用C++ 11的强类型enum,可以声明类的成员枚举,如下所示:

class X {
public:
    enum class E;
};

enum class X::E { a, b };
Run Code Online (Sandbox Code Playgroud)

但是,在制作X类模板时:

template <typename T>
class X {
public:
    enum class E;
};

template <typename T>
enum class X<T>::E { a, b };
Run Code Online (Sandbox Code Playgroud)

gcc 4.7.2和clang 3.0都抱怨"错误:'枚举X :: E'是枚举模板[-pedantic]"和"错误:枚举不能是模板".我认为相关的标准部分(事实上,这个问题来自于)是§14模板,其中第一段规定:

声明模板声明

  • 声明或定义函数或类,或
  • 定义成员函数,成员类,成员枚举类模板或嵌套在类模板中的类的静态数据成员,或者
  • 定义类或类模板的成员模板,或
  • 是一个别名声明.

(强调我的).这是一个编译器错误,还是我完全错误地解释了这个语句?

Con*_*tor 3

我被要求创建这个答案。请参阅 C++ 标准的 [temp.mem.enum] 14.5.1.4/1 段:

\n\n
\n

类模板的枚举成员可以在类模板定义之外定义。[例子:

\n\n
template<class T> struct A {\n  enum E : T;\n};\nA<int> a;\ntemplate<class T> enum A<T>::E : T { e1, e2 };\nA<int>::E e = A<int>::e1;\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x94end 示例]

\n
\n\n

较新版本的clang (3.4)可以使用 flag成功编译您的代码-pedantic-errors,而gcc 4.8.1仍然认为这是一个错误。我认为这是一个海湾合作委员会 bug。

\n