почему я не могу использовать ссылочный тип в операторе =? - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь переопределить operator+ и operator= для моих классов.Это мой код:

#include <iostream>
#include <vector>

using namespace std;

class Integer {
public:
    int i;
    Integer operator+ (Integer&);
    Integer& operator= (Integer&);
};

Integer Integer::operator+(Integer& rhs) {
    Integer res;
    res.i = this->i + rhs.i;

    return res;
}

Integer& Integer::operator=(Integer& rhs) {

    this->i = rhs.i;
    return *this;
}

int main()
{
    Integer i1, i2, i3;
    i1.i = 1, i2.i = 2;
    i3 = i1 + i2;
    cout << i3.i;
}

В Visual Studio 2017 компилятор жаловался, что:

"E0349  no operator "=" matches these operands"

Кажется, что объект Integer не совпадает с Integer& вфункция operator=.Но это работает для функции operator+.Это очень запутанно.

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Я вычеркну это из оператора присваивания.

i3 = i1 + i2;

Первое, что произойдет, будет вычисление выражения сложения.Вот этот фрагмент кода:

i1 + i2

Вы разработали перегрузку вашего оператора для обработки этого выражения.Ваша пользовательская перегрузка оператора сложения возвращает новый экземпляр Integer.Но проблема возникает, когда вы пытаетесь назначить этот новый экземпляр параметру в вашей перегрузке назначения.Вот фрагмент этого кода.

Integer& Integer::operator=(Integer& rhs);

Когда вы используете ссылочный параметр в объявлении функции, компилятор проверяет, чтобы убедиться, что это значение не является временным значением, чтобы оно существовало после функцииназывается.Компилятор определил (правильно), что аргумент, переданный этому оператору присваивания, является временным значением.Вот почему он выдает ошибку, когда вы пытаетесь сделать это.

Самая логичная причина, по которой я вижу смысл в вашем коде , имеет смысл - это реализовать следующее:

Integer& Integer::operator=(const Integer& rhs) {
    this->i = rhs.i;
    return *this;
}

Добавляя const-спецификатор, вы сообщаете компилятору, что вы не полагаетесь на rhs для сохранения существования после вызова функции.В этом случае значение, передаваемое параметру, может быть временным значением.

0 голосов
/ 22 сентября 2018
i3 = i1 + i2;

возвращает временную переменную типа Integer.

Теперь ваш operator= занимает Integer&.Это ссылка на Integer.Проблема в том, что временные ссылки не могут связываться с неконстантными ссылками.

Просто убедитесь, что вы изменили на const Integer&.Это значение по умолчанию для всех перегрузок операторов в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...