根据17.7.3 [temp.expl.spec]第5段(N4659),
...显式专用类模板的成员以与普通类成员相同的方式定义,而不是使用
template<>
语法。定义显式专用成员类的成员时也是如此。 但是,template<>
用于定义专门用作类模板的显式专用成员类模板的成员。
E
的显式专业化绝对不属于大胆的情况,它仍然需要template<>
。那是为什么?
template<class T> struct A {
enum E : T;
};
template<> enum A<int>::E : int { eint };
答案 0 :(得分:6)
此段落与显式专用类模板的成员相关,但您尚未明确专门化类模板。这是它所谈论的案例的一个例子:
template<class T> struct A {
enum E : T;
};
template<> struct A<int> {
enum E : int;
};
enum A<int>::E : int { eint }; // no template<> here
在您的示例代码中,您明确指定了主要模板的成员,该成员确实需要使用template<>
,如第一段所述。
1以下任何一项的明确专业化:
...
(1.7) - 类模板的成员枚举
...
可以通过模板&lt;&gt;引入的声明声明;那是: 明确的分工: 模板&lt; &GT;声明
第5段背后的基本原则是,一旦你明确专门化了一个模板,它就不再是一个模板了,你就像使用任何其他非模板实体那样使用专门化。