请向我解释为什么下面的代码符合并可以正常工作。
我很迷茫。
#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/