Определение члена класса в первичном шаблоне и неявное создание экземпляра во время специализации

У меня есть следующий пример, который я разложил из §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

вам нужно специализироваться на определении всего класса:

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

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