Ответ 1
вам нужно специализироваться на определении всего класса:
template<class T>
struct A {
enum E : T { eT };
};
template<>
struct A<char> {
enum E : char { echar };
};
У меня есть следующий пример, который я разложил из §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 };
};