c++ - 默认模板参数部分特化

标签 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;
}

它不应该属于模板类Base的一般形式吗?

最佳答案

默认参数适用于特化-实际上,特化必须接受(可以这么说)基本模板的默认参数。尝试在特化中指定默认值:

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

template<class B=char>
// ...

...是一个错误。

同样,如果我们更改特化,以使其特化针对基本模板提供的默认类型以外的其他类型:
template<class A = int, class B=double>
class Base
{};

template<class B>
class Base <char, B>

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

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

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

关于c++ - 默认模板参数部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63930590/

相关文章:

c++ - std 容器的模板 typedef(没有专门化)?

c++ - 使用placement new 来实现多态unique_ptr

c++ - 如何仅为父类可变模板参数启用嵌套类模板?

c++ - 模板参数中的 const

C++ 模板函数特化

C++ 部分特化(函数指针)

c++ - 如何避免重复对/在 multimap 中找到一对?

c++ - 使用强制转换运算符和单参数构造函数重载类的运算符

c++ - yaml-cpp 库的 API 文档

c++ - 将函数绑定(bind)到类型的更好语法?