在主模板中定义类成员,并在特化期间进行隐式实例化

Definition of a class member in the primary template and an implicit instantiation during specialization

本文关键字:实例化 定义 成员      更新时间:2023-10-16

我从§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:

类模板特化的隐式实例化会导致[…]的隐式实例化。的定义

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

您需要对整个类定义进行专门化:

template<class T>
struct A {
  enum E : T { eT };
};
template<>
struct A<char> {
  enum E : char { echar };
};
相关文章: