请考虑以下代码段:
template <typename A, typename B=bool>
struct pair {
pair() {std::cout<<"This";}
A first;
B second;
};
template <typename T>
struct pair<T, bool> {
pair() {std::cout<<"That";}
T first;
bool second;
};
我希望看到,出于学习目的,将实例化上述哪些结构(通用声明或部分专业化),给出以下代码:
int main() {
pair<int,int> pairB; // prints 'This'
pair<double,bool> pairC; // prints 'That'
pair<float> pairD; // prints 'That'
}
虽然前两个对我有意义,但第三个......不是那么多
第三个不应该是这个&#39;这个&#39;呢?
第二个声明不是第二个类型为bool
的部分专业化吗?
嗯......第二种类型不是bool
,那么为什么不能实例化第一种?
答案 0 :(得分:2)
当编译器看到pair<float>
时,它首先查找主模板的定义,即:
template <typename A, typename B=bool>
struct pair
这提供了以下参数列表(因为第二个默认值为bool
):<float, bool>
。
然后,编译器会查找任何可能的匹配特化,并找到一个:
template <typename T>
struct pair<T, bool> // Match <float, bool>
所以选择了这个专业化。