C++中两个带默认参数的重载函数如何同时调用?
报错原因
你遇到的编译报错核心是重载函数调用歧义,问题根源如下:
你定义的两个add重载均带有默认参数,当调用add(5,9)传入2个参数时,编译器存在两个优先级完全一致的匹配选项,无法自主选择,直接抛出歧义错误:
- 匹配2个参数的
add版本,用传入的5、9作为形参x、y的值 - 匹配3个参数的
add版本,用传入的5、9作为形参x、y的值,第三个参数z使用默认值12
你提供的测试代码如下:
#include <iostream> using namespace std; void add(int x=2,int y=4){ cout<<x+y<<endl; } void add(int x=2, int y=14, int z=12) { cout<<x+y+z<<endl; } int main(){ add(5,9); // 此行触发调用歧义 add(2,3,6); // 此行本身无问题,可以唯一匹配3参数的add版本 return 0; }
可行解决方法
- 方案1:移除其中一个重载函数的默认参数,消除歧义场景。比如给3参数版本去掉前两个参数的默认值:
此时调用// 修改后的3参数add版本 void add(int x, int y, int z=12) { cout<<x+y+z<<endl; }add(5,9)就只能匹配2参数的add版本,不会产生歧义。 - 方案2:调用时明确指定要匹配的重载版本,可通过强制函数指针类型转换的方式明确选择:
// 明确选择2参数版本的add static_cast<void(*)(int, int)>(add)(5,9); - 方案3:调整重载函数的形参类型,让不同版本的参数列表有明确区分度,避免出现参数个数重叠的匹配场景。
内容的提问来源于stack exchange,提问作者Annie
相关产品推荐
相关产品推荐

