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隐式指定).
| 归档时间: |
|
| 查看次数: |
9863 次 |
| 最近记录: |