You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++自定义Money类long参数构造函数报错改为int则正常原因是什么

问题成因

该错误的核心是重载构造函数的调用二义性,符合C++的重载决议规则:

  • 你代码里的1500是int类型的整数字面量,本身既不是long类型也不是double类型
  • 当你同时声明了两个构造函数Money(long m)和Money(double m)时,int类型的1500匹配两个构造函数都需要做一次标准类型转换:
    • 路径1:int隐式转换为long
    • 路径2:int隐式转换为double
  • C++标准中这两种转换的优先级完全相等,编译器无法判定应该选择哪一个构造函数,就会抛出二义性错误。
  • 当你把构造函数的参数从long替换为int后,Money(int m)对int类型的1500是精确匹配,优先级远高于int转double的转换,重载决议会直接选择int参数的构造函数,不存在冲突,因此运行正常。

可选修复方案

如果你需要保留long类型参数的构造函数,可以选择以下任意一种方式避免二义性:

  • 调用构造函数时显式指定字面量类型:return Money(1500L);,1500L是long类型字面量,可精确匹配long参数的构造函数
  • 给其中一个构造函数添加explicit关键字,禁止隐式转换,消除二义性
  • 新增一个接收int类型参数的构造函数重载

内容的提问来源于stack exchange,提问作者yaelreshet11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:06:07