我有以下代码:
//1
template<typename T>
void c(T in) {
cout << "Template c(" << in << ")" << endl;
}
//2
template<>
void c<>(int* in) {
cout << "Template specialization b(" << in << ")" <<endl;
}
//3
template<typename T>
void c(T* in) {
cout << "Template for pointers c(" << in << ")" <<endl;
}
//..
int i = 8;
c(&i);
有人可以解释一下为什么在下面的示例编译器中选择函数#3,但是当我更改函数#2和#3的顺序时,编译器会选择函数#2吗?
答案 0 :(得分:14)
编译器首先选择主模板,然后才确定要使用的专业化。也就是说,在您的情况下,编译器总是选择第二个主模板,即#3。
但是,由于在专门化功能模板时没有指定模板参数,因此您的专业化会根据其位置专门设置不同的主模板:使用给定的顺序,它会专门化第一个主模板,当您更换顺序时#2和#3专门用于第二个主要模板。在14.7.3 [temp.expl.spec]第7段中,标准必须说明以下情况
......在写专业时,要小心它的位置;或者使它编纂将是一种试图点燃其自焚的试验。
如果您想控制专业化实际专业化的主要模板,您可以在专业化中指定模板参数:
template <> void c<int*>(int* in) { ... } // specializes the first primary
template <> void c<int>(int* in) { ... } // specializes the second primary