这是我不理解的代码
#include<iostream>
using namespace std;
template <typename T>
T calc(T, T) { cout << "template calc" << endl; }
double calc(double, double) { cout << "ordinary calc" << endl; }
template <>
char calc<char>(char, char) { cout << "template specialisation calc" << endl; }
int main() {
int ival;
double dval;
float fd;
calc(0, ival); // calls the generic calc(T, T)
// the following all call calc(double, double)
calc(0.25, dval);
calc(0, fd);
calc(0, 'J');
calc('I', 'J'); // calls calc(char, char)
}
calc 有 5 个函数调用,所以我将它们称为 1) - 5),具体取决于它们的位置。
1)有点道理。0 是整数,ival 是整数,调用 calc(T, T) 是有意义的。尽管如此,我觉得我对此的推理是错误的。毕竟,它们都是双精度数,所以如果调用 calc(double, double),那也是有意义的。所以在这里寻求澄清。
2) 没有戏剧,都是双打,调用 calc(double, double)。简单的。
3) fd 是一个浮点数。可以调用 calc(T, T) 或 calc(double, double)。因为 1) 导致了对 calc(T, T) 的调用,所以我假设这里也是如此,因为我们再次有一个参数为 0,但是,这调用了 calc(double, double)。所以这让我很困惑,特别是这和1)之间的区别
4) 我的第一个想法是 0 是一个有效字符,'J' 也是如此,所以它调用 calc(char, char)。它可能会使用常见的整数类型调用 calc(T, T)。但是不,两者都错了,它调用 calc(double, double)。我对这个很困惑。对我来说毫无意义。
5) 是有道理的,但前提是我应用与 4) 相同的逻辑,这在 4) 中是错误的,所以如果我要看到另一个使用模板的示例,我将不确定要应用什么逻辑。
所以寻找解释为什么这个程序做它做的事情。
谢谢。