C++自定义Money类long参数构造函数报错改为int则正常原因是什么
问题成因
该错误的核心是重载构造函数的调用二义性,符合C++的重载决议规则:
- 你代码里的
1500是int类型的整数字面量,本身既不是long类型也不是double类型 - 当你同时声明了两个构造函数
Money(long m)和Money(double m)时,int类型的1500匹配两个构造函数都需要做一次标准类型转换:- 路径1:
int隐式转换为long - 路径2:
int隐式转换为double
- 路径1:
- C++标准中这两种转换的优先级完全相等,编译器无法判定应该选择哪一个构造函数,就会抛出二义性错误。
- 当你把构造函数的参数从
long替换为int后,Money(int m)对int类型的1500是精确匹配,优先级远高于int转double的转换,重载决议会直接选择int参数的构造函数,不存在冲突,因此运行正常。
可选修复方案
如果你需要保留long类型参数的构造函数,可以选择以下任意一种方式避免二义性:
- 调用构造函数时显式指定字面量类型:
return Money(1500L);,1500L是long类型字面量,可精确匹配long参数的构造函数 - 给其中一个构造函数添加
explicit关键字,禁止隐式转换,消除二义性 - 新增一个接收
int类型参数的构造函数重载
内容的提问来源于stack exchange,提问作者yaelreshet11
相关产品推荐
相关产品推荐

