默认模板参数部分特化

And*_*ndy 47 c++ templates specialization default-parameters

请向我解释为什么以下代码符合并完美运行.我很迷茫.

#include<iostream>
template<class A = int, class B=double>
class Base
{};

template<class B>
class Base <int, B>
{
public:
  Base()
  {
     std::cout<<"it works!!!!!\n";
  }
};

int main()
{
  Base<> base; // it prints "it works!!!!!"
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它不应该属于模板类Base的通用形式吗?

Jer*_*fin 31

默认参数适用于特化 - 事实上,特化必须接受(可以说)基本模板的默认参数.试图在专业化中指定默认值:

template<class A = int, class B=double>
class Base
{};

template<class B=char>
// ...
Run Code Online (Sandbox Code Playgroud)

......是一个错误.

同样,如果我们改变了专业化,使其专业化是一种其他比基本模板提供的默认:

template<class A = int, class B=double>
class Base
{};

template<class B>
class Base <char, B>
Run Code Online (Sandbox Code Playgroud)

...然后将选择基本模板.

所以,正在发生的是:首先选择模板参数的类型.在这种情况下(实例化时未指定类型),这两种类型都基于基本模板中指定的默认模板参数.

然后(作为一个基本上单独的步骤),它对适合这些参数类型的所有模板执行重载分辨率的模拟.与通常的重载解析一样,显式指定的类型优先于隐式指定的类型,因此您的特化(int显式指定)优先于基本模板(int隐式指定).