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
    vs
    const int
    时,您会得到一个编译错误。如果将
    int
    更改为
    int&
    并将
    const int
    更改为
    const int&
    (),它将被编译。@J.G
    const
    在传递值时对调用方没有影响,因为使用了复制语义。您可以调用
    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
    vs
    const int
    时,您会得到一个编译错误。如果将
    int
    更改为
    int&
    并将
    const int
    更改为
    const int&
    (),它将被编译。@J.G
    const
    在传递值时对调用方没有影响,因为使用了复制语义。您可以调用
    foo(int)
    并传递它
    constintb=5
    ,因为
    b
    无论如何都会被复制。因此
    foo(int)
    foo(const int)
    重载将是不明确的。
    int&
    const int&
    的情况不同,因为不能通过引用将
    const
    传递给非const参数。这就是为什么重载
    foo(int&)
    foo(const int&)
    是明确的。