我在c ++中通过编译以下代码来尝试默认参数值和函数重载,我对输出感到惊讶:
Line 19: error: call of overloaded 'add()' is ambiguous
我编译的代码是:
#include <iostream>
using namespace std;
void add(int a=1, int b=1){
cout<<a+b;
}
void add(){
int a =2, b=2;
cout<<a+b;
}
int main(){
add();
return 0;
}
任何解释为什么它含糊不清? Thx提前。
答案 0 :(得分:8)
因为两个签名都与呼叫匹配。
add();
可以解释为add(1,1)
或add()
。当你写void add(int a=1, int b=1)
时,你告诉编译器 - “听老兄,如果我拨打add
没有参数,我希望你将它们默认为1
”
最重要的是,当您在没有参数的情况下致电add()
时,您会发生什么?
如果您希望打印2
,请删除不带参数的版本。
如果您希望打印4
,请从第一个版本中删除默认参数。
答案 1 :(得分:2)
void add(int a, int b);
void add();
您不应该提供a
和b
默认值。使用默认值时,编译器无法知道对add()
的调用是否应使用第一个或第二个函数。
您是否需要提供a
和b
默认值?