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

时间:2014-08-17 17:34:28

标签: c++ templates c++11 enums template-specialization

我有以下示例,我从§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

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

  

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

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

1 个答案:

答案 0 :(得分:1)

你需要专注于整个班级的定义:

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

template<>
struct A<char> {
  enum E : char { echar };
};