这是我不理解的代码
#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)
}
有5个函数调用calc,所以我会根据它们的位置将它们称为1) – 5).
1)有道理. 0是整数,ival是整数,有意义的是调用calc(T,T).虽然我觉得我的理由是错误的.毕竟,它们都是双打的,所以如果调用calc(double,double),那也是有意义的.所以在这里寻求澄清.
2)没有戏剧,都是双打,叫钙(双,双).简单.
3)fd是一个浮点数.可以调用calc(T,T)或calc(double,double).因为1)导致对calc(T,T)的调用,我会假设同样会在这里保持,因为我们再次有一个param为0,但是,这会调用calc(double,double).所以这让我感到困惑,特别是这和1之间的区别
4)我的第一个想法是0是一个有效的字符,所以是’J’,所以它调用calc(char,char).它可以使用常见的整数类型调用calc(T,T).但是没有,两个都错了,它叫做calc(double,double).我对此非常困惑.对我毫无意义.
5)有道理,但只有我应用了与4)相同的逻辑,这在4)中是错误的,所以如果我要看到另一个使用模板的例子,我不确定应用什么逻辑.
所以寻找解释为什么这个程序做它的功能.
谢谢.
最佳答案 首先,当您在源代码中写入文字“0”时,它的类型为“int”.在查找要调用的函数时,编译器会选择最匹配的函数.如果不可用,编译器将执行一些隐式类型转换以使其工作.
1)0和ival都是int
2)对于double和double,calc(double,double)完全匹配
3)对于int和float,找不到匹配,因此两者都转换为double
4)对于int和char,与3)相同
5)对于char和char,calc(char,char)完全匹配