C++ 调用重载函数时int到double的转换
为什么C++ 调用重载函数时int到double的转换,c++,C++,为什么essai(n,p)在这里产生编译错误?这是因为无法将int转换为double吗?编译器不知道要将int中的哪些数据转换为double 您应该显式地将其转换为调用essai: essai(n,(double)p) 或者叫essai II: essai((双)n,p)编译器不知道要将int中的哪些数据转换为double 您应该显式地将其转换为调用essai: essai(n,(double)p) 或者叫essai II: essai((双)n,p)两者 void essai (int, do
essai(n,p)
在这里产生编译错误?这是因为无法将int转换为double吗?编译器不知道要将int
中的哪些数据转换为double
您应该显式地将其转换为调用essai:essai(n,(double)p)代码>
或者叫essai II:
essai((双)n,p)
编译器不知道要将int
中的哪些数据转换为double
您应该显式地将其转换为调用essai:
essai(n,(double)p)代码>
或者叫essai II:
essai((双)n,p)代码>两者
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
s中的一个需要转换,以便它可以转换其中一个。由于您有两个相等的重载,编译器将放弃,并应发出一个不明确的编译器错误。
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
s中的一个需要转换,以便它可以转换其中一个。由于有两个相等的重载,编译器将放弃,并应发出一个不明确的编译器错误。编译器将针对三种情况中的每种情况查看essai
的两个重载,并决定采用哪种重载,以及执行何种转换以进行调用:
在essai(n,z)
overload#的情况下,1获胜,因为它可以在不进行转换的情况下调用,而overload#2可以进行两次转换
在essai(c,z)
的情况下,重载1获胜,因为它可以通过char
到int
的一次转换来调用,而重载2可以进行两次转换
对于essai(n,p)
,两个重载都需要相等数量的转换(两个)。由于没有明确的赢家,编译器认为调用不明确,并发出错误
编译器针对三种情况中的每种情况查看essai
的两个重载,并决定采用哪种重载,以及执行哪些转换以进行调用:
在essai(n,z)
overload#的情况下,1获胜,因为它可以在不进行转换的情况下调用,而overload#2可以进行两次转换
在essai(c,z)
的情况下,重载1获胜,因为它可以通过char
到int
的一次转换来调用,而重载2可以进行两次转换
对于essai(n,p)
,两个重载都需要相等数量的转换(两个)。由于没有明确的赢家,编译器认为调用不明确,并发出错误
编译器是怎么说的?这只是理论课程笔记。essai中没有定义函数。我明天有考试,我不明白为什么会有编译错误。哎哟。。。祝你好运……你可以弄明白:)只需关注essai(n,p)
编译器对它有什么看法?这只是理论课程笔记。essai中没有定义函数。我明天有考试,我不明白为什么会有编译错误。哎哟。。。祝你好运……你可以弄明白:)只需关注给essai(n,p)
personal问题:如果定义了两个函数void fexample(int)
和void fexample(const int)
,有编译器错误吗?@J.G@J.G在试图覆盖int
vsconst int
时,您会得到一个编译错误。如果将int
更改为int&
并将const int
更改为const int&
(),它将被编译。@J.Gconst
在传递值时对调用方没有影响,因为使用了复制语义。您可以调用foo(int)
并传递它constintb=5
,因为b
无论如何都会被复制。因此foo(int)
与foo(const int)
重载将是不明确的。int&
与const int&
的情况不同,因为不能通过引用将const
传递给非const参数。这就是为什么重载foo(int&)
与foo(const int&)
是明确的。个人问题:如果定义了两个函数void fexample(int)
和void fexample(const int)
,有编译器错误吗?@J.G@J.G在试图覆盖int
vsconst int
时,您会得到一个编译错误。如果将int
更改为int&
并将const int
更改为const int&
(),它将被编译。@J.Gconst
在传递值时对调用方没有影响,因为使用了复制语义。您可以调用foo(int)
并传递它constintb=5
,因为b
无论如何都会被复制。因此foo(int)
与foo(const int)
重载将是不明确的。int&
与const int&
的情况不同,因为不能通过引用将const
传递给非const参数。这就是为什么重载foo(int&)
与foo(const int&)
是明确的。