此问题旨在澄清以下有关部分模板专业化的文档部分:
partial template specialization
我的问题属于部分初始化成员标题下的以下文字:
如果类模板是另一个类模板的成员,则它具有 部分专业化,这些专业化是成员 封闭类模板。如果实例化封闭模板, 实例化每个成员部分特化的声明 同样(所有其他的声明,但不是定义) 模板的成员被实例化)
如果主要成员模板明确(完全)专门用于a 给定(隐式)封闭类模板的特化, 为此,将忽略成员模板的部分特化 封闭类模板的特化。
如果明确表示成员模板的部分特化 专门用于封闭的给定(隐式)特化 类模板,主要成员模板和其他部分模板 专业化仍然考虑到这个专业化 封闭类模板。
上面演示的示例部分提到了以下内容:
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
我不明白上述三种情况之间的区别,根据上面复制的文字,这种情况需要在每种情况下采取不同的处理方式。
任何人都可以提供简单的解释吗?
答案 0 :(得分:0)
由于我不确定我的问题是否正确,所以请放纵。我假设你想知道你所呈现的实例中行为的差异和原因。
首先,您需要了解编译器如何选择要使用的模板特化。有一个很好的解释here,但它主要归结为:编译器总是选择模板最受限制/专门的模板专业化。
现在,让我们看看你在那里做的第一个实例:
A<char>::B<int*> abcip;
由于A<char>::B
没有完全专业化,我们会查看A
的一般定义,并为B<int*>
找到两个匹配的模板专精。
B<T2>
T2=int*
和B<T2*>
T2=int
。{。}
由于B<T2*>
是受限制的,我们选择这一个。
现在让我们看看第二个实例:
A<short>::B<int*> absip;
引用文本的第2段现在适用,因为主要成员模板A<short>::B
存在完全专业化。部分专业化A<T>::B<T2*>
将不予考虑。这是有道理的,因为A<short>::B<T2>
比A<T>::B<T2*>
更专业。如果我们要在您的代码中添加以下内容,情况会发生变化:
template<>
template<class T2>
struct A<short>::B<T2*> {};
由于这更加专业化,因此它将成为此实例化的选定模板。
最后一个实例化只是选择主要成员模板A<T>::B<T2>
,因为这是唯一匹配的类型。