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

时间:2014-03-17 11:27:12

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

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

class X {
public:
    enum class E;
};

enum class X::E { a, b };

但是,在制作X课程模板时:

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

template <typename T>
enum class X<T>::E { a, b };

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

  

模板声明中的声明

     
      
  • 声明或定义函数或类,或
  •   
  • 定义成员函数,成员类,成员枚举,或类模板的静态数据成员 或类嵌套在类模板中,或
  •   
  • 定义类或类模板的成员模板,或
  •   
  • alias-declaration
  •   

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

1 个答案:

答案 0 :(得分:3)

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

  

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

template<class T> struct A {
  enum E : T;
};
A<int> a;
template<class T> enum A<T>::E : T { e1, e2 };
A<int>::E e = A<int>::e1;
     

- 示例]

较新版本的 clang (3.4)compiles your code successfully,标记为-pedantic-errors,而 gcc 4.8.1 still considers it is an error。我认为这是一个 gcc 错误。