请向我解释为什么下面的代码符合并完美运行。
我很困扰。
#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>
// ...
...是一个错误。
同样,如果我们更改专业化,使其专业化针对某种类型other比基本模板提供的默认值:
template<class A = int, class B=double>
class Base
{};
template<class B>
class Base <char, B>
...然后将选择基本模板。
所以,发生的事情是这样的:首先选择模板参数的类型。在这种情况下(实例化时未指定类型),两种类型都基于基本模板中指定的默认模板参数。
然后(作为一个基本上独立的步骤),它对适合这些参数类型的所有模板执行重载解析的模拟。与重载决策一样,显式指定的类型优于隐式指定的类型,因此您的专业化(指定了int
显式地)优于基本模板(它指定了int
隐含地)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)