1

我经常遇到编译错误:

'bObj1 = Balance::operator+(Balance&)(((Balance&)(& bObj2)))'中的 'operator=' 不匹配</p>

有人能帮忙指出原因吗?提前致谢。

代码:

class Balance
{
public:
    Balance (int b = 0) {balance = b;};
    Balance (Balance &);

    Balance & operator= (Balance &);
    Balance operator+ (Balance &);

    int get() {return balance;};
    void set(int b) {balance = b;};

private:
    int balance;
};

Balance & Balance::operator=(Balance &copy)
{
    balance = copy.get();
    return *this;
}

Balance Balance::operator+ (Balance &rig)
{
    Balance add;
    add.set(this->get() + rig.get());
    return add;
}

int main()
{
    Balance bObj1, bObj2(100);
    bObj1 = bObj2;
    bObj1 = bObj1 + bObj2; // This line cause the error.
    return 0;
}
4

2 回答 2

2

您的分配运算符是错误的。您可以安全地删除它,因为隐式运算符对于您的简单类来说就足够了。阅读何时需要编写赋值运算符?更多细节。

class Balance
{
public:
  Balance (int b = 0) {balance = b;};
  Balance operator+ (const Balance &);

  int get() const {return balance;};
  void set(int b) {balance = b;};

private:
  int balance;
};

Balance Balance::operator+ (const Balance &rig)
{
  Balance add;
  add.set(this->get() + rig.get());
  return add;
}
于 2013-09-02T03:29:54.370 回答
0

将运算符覆盖与非常量引用一起使用时会遇到问题。将函数更改为 const:

Balance & operator= (const Balance &);
Balance operator+ (const Balance &) const;

int get() const { return balance; }

+应用运算符时,结果是一个rvalue 它是不可变的。因为您=不能接受rvalue引用(因为它不是 const),所以编译器无法匹配运算符。

上面,我让你的函数对右值友好。运算符将=接受一个右值。该+运算符还接受一个右值,const因为它不修改对象。因为它是 const,所以我也将get函数设为了 const。

于 2013-09-02T03:16:36.750 回答