TRP*_*RPh 6 c++ templates specialization
我已阅读模板的隐式专业化意味着什么?及其答案,但我仍然不满意我从 cppreference.com理解部分模板专业化的这一部分:
如果主要成员模板显式(完全)专门用于封闭类模板的给定(隐式)特化,则对于封闭类模板的这种特化,成员模板的部分特化将被忽略......
Run Code Online (Sandbox Code Playgroud)template<class T> struct A { //enclosing class template template<class T2> struct B {}; //primary member template template<class T2> struct B<T2*> {}; // partial specialization of member template }; template<> template<class T2> struct A<short>::B {}; // full specialization of primary member template // (will ignore the partial) A<char>::B<int*> abcip; // uses partial specialization T2=int A<short>::B<int*> absip; // uses full specialization of the primary (ignores partial) A<char>::B<int> abci; // uses primary
问题:
评论说该行template<> template<classT2> struct A<short>::B {};是“主要成员模板的完全专业化”。主要成员模板在注释中标识为结构B。行怎么能的专业化B当它A正被由专门的替代short的class T?
B当模板参数T2未指定时,该行如何成为“完全”特化?
注释和随附的文本表明“显式专业化”和“完全专业化”是同义词。如果上面引用的代码行是 的显式特化B,那么隐式特化在A哪里?
类模板的成员可以显式特化,即使它不是模板:
\ntemplate<int I>\nstruct X {\n int f() {return I;}\n void g() {}\n};\ntemplate<>\nint X<0>::f() {return -1;}\nRun Code Online (Sandbox Code Playgroud)\n这相当于专门化整个类模板,但具有从相关主模板复制的其他成员或部分专门化:
\ntemplate<>\nstruct X<0> {\n int f() {return -1;}\n void g() {}\n};\nRun Code Online (Sandbox Code Playgroud)\n(回想一下,这种拼写出来的专门化根本没有义务声明g或作为函数进行声明。)由于您实际上没有编写此内容,因此它仍然被认为是隐式实例化作为X一个整体与给定的改变。
这就是为什么您的专门化A<T>::B提供了模板参数 forA而不是 for B;它正在用另一个模板替换该A<T>::B模板(恰好具有相同的模板参数列表)。我想说 \xe2\x80\x9cprimary\xe2\x80\x9d 这个词在这里是误导性的:它是整个模板被替换,这就是为什么此后忽略部分专业化A<short>。