10

我有以下代码:

//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?

4

1 回答 1

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
于 2013-09-01T11:58:30.983 回答