void essai (int, double); // essai I
void essai (double, int); // essai II
int n, p; double z; char c;
essai(n,z); // calling essai I
essai(c,z); // calling essai I, after the conversion of c in int
essai(n,p); // compilation error
为什么essai(n,p)
会在此处产生编译错误?是因为无法从int转换为double?
答案 0 :(得分:3)
编译器会针对您的三种情况中的每一种情况查看essai
的两个重载,并确定要执行的重载以及执行调用所执行的转换:
essai(n,z)
重载#1获胜,因为它可以在没有转换的情况下调用,而不是2次转换用于重载#2 essai(c,z)
,则重载#1会获胜,因为可以通过char
到int
的单次转换来调用,而不是#2}的两次转换essai(n,p)
,两个重载都需要相同数量的转换(两个)。由于没有明确的赢家,编译器认为调用不明确,并发出错误。答案 1 :(得分:1)
两个
void essai (int, double);
void essai (double, int);
当您调用essai(n,p);
时,是有效的重载,因为int
之一需要转换,因此它可以转换任何一个。由于您有两个相等的重载,编译器会放弃并且应该发出模糊编译器错误。
答案 2 :(得分:0)
编译器不知道要转换为int
的{{1}}哪些数据。
你应该明确地将它转换为调用essai I:
double
或致电essai II:
essai(n,(double)p);