我从§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 };
};

关于c++ - 主模板中类成员的定义以及特化过程中的隐式实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25351809/

10-11 22:38
查看更多