b1s*_*sub 4 c++ templates language-lawyer
根据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 };
Run Code Online (Sandbox Code Playgroud)
此段落与显式专用类模板的成员相关,但您尚未明确专门化类模板.这是它所谈论的案例的一个例子:
template<class T> struct A {
enum E : T;
};
template<> struct A<int> {
enum E : int;
};
enum A<int>::E : int { eint }; // no template<> here
Run Code Online (Sandbox Code Playgroud)
在您的示例代码中,您明确template<>指定了主模板的成员,该成员需要使用,如第一段中所指定.
1以下任何一项的明确专业化:
...
(1.7) - 类模板的成员枚举
...
可以通过模板<>引入的声明声明; 即:explicit-specialization:template <>声明
第5段背后的基本原则是,一旦您明确专门化了模板,它就不再是模板,您就像使用任何其他非模板实体一样使用专门化.