首页 > 解决方案 > 关于运算符 + 重载

问题描述

我有以下代码片段:

#include <iostream>

using namespace std;

struct Integer{
    int x;
    Integer(const int val) : x(val){}
    friend Integer operator+(Integer& i, Integer& j){
        return Integer(j.x + i.x);
    }
    friend std::ostream& operator<<(std::ostream& o, Integer i){
        o << i.x;
        return o;
    }
};

int main(){
    Integer i(25), j(5), k(2020);
    std::cout << (i + j + k);

    return 0;
}

为什么不编译?我得到的错误是“'operator+'不匹配(操作数类型是Integer and Integer)”。为什么会这样?不是从右到左计算的吗?不是, plus which is an(j + k)结果不应该是显而易见的,意思是 2050 吗?我哪里错了?另外,我的目标是说明为什么该代码段无法编译,以及如何通过最多修改一行代码来使其编译。(这是他们在考试时会问我们的)。谢谢 !Integer(2025)iInteger(25)

标签: c++operator-overloading

解决方案


operator+按值返回,它返回的是一个右值,它不能绑定到非 const 的左值引用,即不能operator+作为下一个计算的参数传递。

将参数类型更改operator+为 lvalue-reference 为 const,它可以绑定到 rvalues。

friend Integer operator+(const Integer& i, const Integer& j){
//                       ^^^^^             ^^^^^
    return Integer(j.x + i.x);
}

推荐阅读