我刚刚在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
。
答案 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)
void foo(double x)
与1.2
(double
)完全匹配,其排名高于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;
}