Ошибка при передаче параметров

class CMaiorTest;

class CMinorTest
{
public:
    int Dtest;
    CMinorTest(int i=0) { Dtest = i; };
    friend CMinorTest operator + (CMinorTest& _D1, CMinorTest _D2) { return CMinorTest(_D1+_D2); };
};

class CMaiorTest
{
public:
    CMinorTest CDtest;
    void Ftest(CMinorTest& D) { CDtest.Dtest += D.Dtest; };
};

CMinorTest Minor1, Minor2;
CMaiorTest Maior;

int main()
{
    Maior.Ftest(Minor1+Minor2);
}

код ошибки

error C2664: "void CMaiorTest::Ftest(CMinorTest &)": невозможно преобразовать аргумент 1 из "CMinorTest" в "CMinorTest &"
message : Неконстантная ссылка может быть связана только с левосторонним значением
message : см. объявление "CMaiorTest::Ftest"

Ответы (1 шт):

Автор решения: Harry

Чтобы избавиться от ошибки, о которой говорит компилятор, достаточно слова const:

void Ftest(const CMinorTest& D) { CDtest.Dtest += D.Dtest; };

Но!

friend CMinorTest operator + (CMinorTest& _D1, CMinorTest _D2) {
    return CMinorTest(_D1+_D2); 
};

Итак, у вас есть оператор +. Отлично. Что он делает? Возвращает результат суммирования. Для чего вызывает оператор +.

То есть себя же.

Который вызывает... Ну, вы поняли? Бесконечная рекурсия, Stack Overflow, только не на русском...

Я бы делал так:

friend CMinorTest operator + (const CMinorTest& _D1, const CMinorTest& _D2) { 
     return CMinorTest(_D1.Dtest+_D2.Dtest); 
};
→ Ссылка