C ++部分模板专业化混淆

时间:2014-08-29 19:29:44

标签: c++ templates

请考虑以下代码段:

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,那么为什么不能实例化第一种?

1 个答案:

答案 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>

所以选择了这个专业化。