【问题标题】:Clarification on partial template specialisation关于部分模板专业化的说明
【发布时间】:2023-03-24 09:44:01
【问题描述】:

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

partial template specialization

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

如果一个类模板是另一个类模板的成员,并且它有 部分专业化,这些专业化是 封闭类模板。如果封闭模板被实例化, 每个成员部分特化的声明被实例化 以及(与所有其他的声明方式相同,但不是定义方式) 模板的成员被实例化)

如果主要成员模板明确(完全)专门用于 给定封闭类模板的(隐式)特化, 为此忽略成员模板的部分特化 封闭类模板的特化。

如果成员模板的部分特化是显式的 专门用于封闭的给定(隐式)专业化 类模板、主要成员模板及其其他部分 仍然考虑专业化的这种专业化 封闭类模板。

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

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

我不明白上述三种情况之间的区别,根据上面复制的文字,每种情况都需要不同的处理方式。

谁能提供一个简单的解释?

【问题讨论】:

    标签: c++ templates partial-specialization


    【解决方案1】:

    由于我不确定我是否正确地回答了您的问题,所以请宽容。我假设您想知道您所呈现的实例中行为的差异和原因。

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

    现在,让我们看看您在那里进行的第一个实例化:
    A&lt;char&gt;::B&lt;int*&gt; abcip;
    由于不存在A&lt;char&gt;::B 的完整特化,我们查看A 的一般定义并找到B&lt;int*&gt; 的两个匹配模板特化。
    B&lt;T2&gt;T2=int*B&lt;T2*&gt;T2=int .
    由于B&lt;T2*&gt;是比较受限制的,所以我们选择这个。

    现在让我们看看第二个实例化:
    A&lt;short&gt;::B&lt;int*&gt; absip;
    您引用的文本的第 2 段现在适用,因为存在主要成员模板 A&lt;short&gt;::B 的完整专业化。不考虑部分专业化A&lt;T&gt;::B&lt;T2*&gt;。这是有道理的,因为A&lt;short&gt;::B&lt;T2&gt;A&lt;T&gt;::B&lt;T2*&gt; 更专业。如果我们将以下内容添加到您的代码中,情况将会改变:

    template<>
    template<class T2>
    struct A<short>::B<T2*> {};
    

    因为这更加专业化,所以它会成为这个实例化的选择模板。

    最后一次实例化只是选择了主要成员模板A&lt;T&gt;::B&lt;T2&gt;,因为这是唯一匹配的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      相关资源
      最近更新 更多