【问题标题】:"More than one operator + matches these operands" error“多个运算符 + 匹配这些操作数”错误
【发布时间】:2012-05-07 18:15:29
【问题描述】:

我正在为学校作业创建一个 Money 类。我已经定义了从 Money 到 double 的转换,我有一个 Money 的构造函数,它接受一个 int,另一个构造函数接受一个 double,并且我重载了“+”运算符以将两个 Money 类型的对象相加。当我尝试执行myMoney + 10 之类的操作时出现错误消息,其中 myMoney 是 Money 类型的对象,而 10 显然是一个整数。以下是其余相关代码:

class Money {
private:
    int dollars;
    int cents;
public:
    Money(double r);
    Money(int d) : dollars(d), cents(0) {}
    operator double();
}

Money operator+(Money a, Money b) {
    double r = double(a) + double(b);
    return Money(r);
}

Money::operator double() {
    return dollars+double(cents)/100;
}

Money::Money(double r) {
    ...
}

如果我尝试Money(double(myMoney)+10) 并且如果我明确两个构造函数,该程序实际上可以工作,但我不确定我是否理解自动转换发生了什么。谁能解释这种行为?

【问题讨论】:

  • 您在这里只显示了一个operator+。你还有一个吗?
  • 不,这是我写的唯一的operator+
  • Otero 运算符在语言中定义

标签: c++ operator-overloading type-conversion implicit-conversion explicit-constructor


【解决方案1】:
MyMoney + 10

由于没有operator+(Money, int),因此必须在此处进行一些转换。编译器可以将Money 转换为double,然后将10 转换为'double'并选择内置的operator+(double,double),或者它可以将int 转换为Money 并选择您的@987654328 @。

【讨论】:

  • 因此,如果我向两个构造函数都添加显式,当它能够执行myMoney+int 时,它会进行什么转换?
  • @acplusplusstudent:在这种情况下,它将执行operator+(double,double),因为如果没有强制转换,int 无法转换为 Money。
【解决方案2】:

编译器看到的问题以及 Benjamin 指出的问题是,有两个转换序列会导致 operator+ 重载的不同有效参数集。但这实际上表明设计存在更深层次的问题。几乎不应该使用隐式转换,而对两种不同类型进行隐式转换会导致问题。

考虑使您的构造函数显式化,或者使转换运算符也显式化(C++11 语言特性),或者像std::string::c_str() 中那样删除它们并提供命名转换(通过成员函数而不是运算符)。

任何东西都会自动变成金钱真的有意义吗?它也很容易变成灰尘吗?学会让编译器通过避免削弱类型系统的隐式转换来帮助您检测逻辑问题。

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 2013-04-21
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多