主模板中类成员的定义和特化期间的隐式实例化

0x4*_*2D2 15 c++ enums templates template-specialization c++11

我有以下示例,我已经从中分解§14.7.3/6 [temp.expl.spec]了在主模板中定义类成员枚举,然后专门化它.以下内容不能在clang中编译:

template<class T>
struct A {
    enum E : T;
};

template<class T>
enum A<T>::E : T { eT };

template<>
enum A<char>::E : char { echar }; // ill-formed, A<char>::E was instantiated
                                  // when A<char> was instantiated

// error: explicit specialization of 'E' after instantiation
Run Code Online (Sandbox Code Playgroud)

原因应该是在专门化之前实例化未编组成员枚举的定义.14.7.1 [temp.inst]/1:

类模板特化的隐式实例化导致隐式实例化未编组成员枚举和成员匿名联合的定义.

我试图理解为什么这是一个问题.是因为如果枚举已经有了定义,那么在专门化期间会导致重新定义错误吗?

DU *_*aen 1

你需要专门研究整个类的定义:

template<class T>
struct A {
  enum E : T { eT };
};

template<>
struct A<char> {
  enum E : char { echar };
};
Run Code Online (Sandbox Code Playgroud)