C模板 – 专业功能

我有以下代码
//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 [temp.expl.spec]第7段中,标准必须说明以下情况

… When writing a specialization,be careful about its location; or to make it compile will be such a trial as to kindle its self-immolation.

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

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...