C++模板-专门化函数

C++ Templates - specializing functions

本文关键字:函数 专门化 模板 C++      更新时间:2023-10-16

我有以下代码:

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

编译器首先选择主模板,然后才确定使用哪个专业化。也就是说,在您的情况下,编译器总是选择第二个主模板,即#3。

然而,由于您在专门化函数模板时没有指定模板参数,因此您的专门化会根据其位置专门化不同的主模板:对于给定的顺序,它专门化第一个主模板,当您交换#2和#3的顺序时,它专门处理第二个主模板。在14.7.3[温度解释规范]第7段中,标准必须说明以下关于的情况

写专业文章时,要注意它的位置;或者把它编纂成一本书,这将是一场自焚的考验。

如果您想控制专业化实际专门化的主模板,您可以在专业化中指定模板参数:

template <> void c<int*>(int* in) { ... } // specializes the first primary
template <> void c<int>(int* in)  { ... } // specializes the second primary