重载函数int vs double

时间:2017-08-16 06:58:52

标签: c++ overloading

我刚刚在c ++中使用了重载功能。

首先,我试过

#include <iostream>
void foo(int x) {std::cout << "foo(int)" << x << std::endl;}
void foo(double x) {std::cout << "foo(double)" << x << std::endl;}
void foo(int x,double y) {std::cout << "foo(int,double)" << x << y << std::endl;}
int main() {
    foo(1);
}

有效。

如果我添加了默认参数。

void foo(int x=1,double y=1.1) {std::cout << "foo(int,double)" << x << y << std::endl;}

它给出错误:call to 'foo' is ambiguous。好吧,我知道编译器不知道在foo(int)foo(int,double)之间做出选择。但是,如果我像这样更改main

int main()
{
     foo(1.2);
}

好吧,它编译了,我得到输出foo(double) 1.2。我不明白为什么两种情况之间存在差异。我谷歌相同的问题,但只有问题int vs float

5 个答案:

答案 0 :(得分:0)

如果你添加

void foo(double x=1.1,int y=1) {std::cout << "foo(int,double)" << x << y << std::endl;}

foo(1.2)的示例将无法再次运行,因为它现在匹配foo(double)和foo(double,int),因为您提供了默认参数。这些默认参数仍然是位置的。

答案 1 :(得分:0)

当您为foo(int x,double y)函数提供默认值并从foo(1)调用main()时,您还提供了foo(1, 1.1)的调用因为您已设置默认值。

这使编译器在foo(1)foo(1, 1.1)之间进行了模糊的调用。

但是当你打电话为foo(1.2)时,它只会调用foo(1, 1.2)所以没有歧义。

P.S。输出中有拼写错误:p

答案 2 :(得分:0)

如果您将默认参数添加到最后一个方法,则不仅仅有3个方法。

你有这个:

#include <iostream>
void foo(int x) {std::cout << "foo(int)" << x << std::endl;}
void foo(double x) {std::cout << "foo(double)" << x << std::endl;}
void foo(int x,double y) {std::cout << "foo(int,double)" << x << y << std::endl;}
void foo() {std::cout << "foo(int,double)" << 1 << 1.1 << std::endl;}
void foo(int x) {std::cout << "foo(int,double)" << x << 1.1 << std::endl;}

因此,当你使用像foo(1)这样的int调用时,编译器不知道foo是用int还是foo用int和double。

答案 3 :(得分:0)

查看[over.ics.scs]/3

void foo(double x)1.2double)完全匹配,其排名高于void foo(int x = 1, double y = 1.1),其中需要浮动积分转换。

默认参数在重载时不起作用。

答案 4 :(得分:0)

你需要声明和定义一个带有double类型的变量来调用并用foo(double)成功覆盖foo(int)。

#include <iostream>

using namespace std;

void foo(int x) {std::cout << "foo(int)" << x << std::endl;}
void foo(double x) {std::cout << "foo(double)" << x << std::endl;}
void foo(int x,double y) {std::cout << "foo(int,double)" << x << y << std::endl;}

int main()
{
    double x = 5;
    foo(x);

    return 0;
}