Problem prze przeładowaniu operator +=

0

Witam
Mam taki kod:

 /
#include "stdafx.h"
#include <iostream>
using namespace std;

class Dane{
        friend Dane operator-(double y, Dane& X);
        friend ostream& operator<<(ostream& out, Dane X);
        
        
        double a;
        long double b;
    public:
        //konstruktory:
        Dane(double x):a(x),b(x){}
        Dane():a(1),b(1){}
        //operatory:
        Dane operator++(int)
        {
             Dane wynik(*this);
             a++; b++;
             return wynik;
        }
        
        Dane& operator +=(Dane &X)
        {
             a += X.a;
             b += X.b;
             return *this;
        }
        operator float()
        {
             return (float)a; 
        }
        
        bool operator==(Dane& X)
        {
             if(a==X.a && b==X.b)
                return 1;
             else 
                return 0;
        }
        
        Dane& operator--()
        {
             a--; b--;
             return *this;
        }
        
        Dane operator-()
        {
             Dane wynik;
             wynik.a = -a;
             wynik.b = -b;
             return wynik;
        }
    
};

Dane operator-(double y, Dane& X)
{
     Dane wynik;
     wynik.a = y - X.a;
     wynik.b = y - X.b;
     return wynik;
}

ostream& operator<<(ostream& out, Dane X)
{
     out<<X.a<<endl<<X.b;
     return out;
}


int main()
{
    Dane A(-3.1415),B(A), C, D; // wartości domniemane = 1
    C += (-1.0 - (A++));
    float z = C;
    bool b = D == B;
    C = - (--A);
    cout << A;
    system("pause");
}


I nie mogę dojść dlaczego przy kompilacji wyrzuca mi błąd...
Z góry dzięki za pomoc.

0

Dobra, znalazłem błąd. Nie powinno być referancji przy argumencie. A czy mogłby mi ktoś tak dokładnie wytłumaczyc, dlaczego tak się dzieję?

0

Referencja może być, ale const. Dzieje się tak dlatego, gdyż przekazujesz wartość tymczasową (rvalue) jako argument funkcji przyjmującej niestałą referencję (lvalue).

0

Zgadza, się const rozwiąże problem, ale problem jest trochę bardziej złożony. Bez błędu kompilacji przejdzie bez const jeżeli wywalisz operator rzutowania do float. Tak naprawdę ten operator- zdefiniowany poza klasą nie jest wywoływany.
Idzie to tak: operator++ -> konwersja do float -> promocja do double -> odjęcie tego co wyszło od tego -1.0 -> konstruktor kopiujący przyjmujący jako argument double -> operator+=

0

Dane operator-(double, Dane&) też powinien przyjmować X jako const.
operator== i operator<< też wypadałoby zdefiniować jako przyjmujący const-ref zamiast kopii.

1 użytkowników online, w tym zalogowanych: 0, gości: 1