繁体   English   中英

澄清部分模板专业化

[英]Clarification on partial template specialisation

此问题要求澄清以下有关部分模板专业化的文档中的一部分:

部分模板专业化

我的问题与部分初始化的成员标题下的以下文本有关:

如果一个类模板是另一个类模板的成员,并且具有部分专长,则这些专长是封闭类模板的成员。 如果实例化了封闭模板,则实例化每个成员部分专业化的声明(实例化模板的所有其他成员的声明(而不定义)的方式相同)

如果主要成员模板明确地(完全)专门用于封闭类模板的给定(隐式)专业化,则成员模板的部分专门性将被忽略。

如果成员模板的部分专业化明确地专用于封闭类模板的给定(隐式)专业化,则仍然考虑将主要成员模板及其其他部分专业化用于封闭类模板的这种专业化。

上面演示的示例部分提到了以下内容:

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

我不理解上述三种情况之间的区别,根据上述文字,每种情况都需要不同的对待。

谁能提供简单的解释?

由于我不确定我是否正确回答了您的问题,因此请放心。 我假设您想知道所呈现的实例之间的区别以及行为的原因。

首先,您需要知道编译器如何选择要使用的模板专业化。 有一个很好的解释在这里 ,但它主要分解为:编译器总是选择最受限的模板/专业模板专业化。

现在,让我们看看您在此处进行的第一个实例化:
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> ,因为这是唯一的匹配类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM