C++ отсутствует оператор, соответствующий этим операндам

создал свой класс, перегрузил + и <<, с << все хорошо, а плюсом какие-то проблемы. Не могу ничего делать с результатом операции, ни присвоить переменной результат, ни вывести в поток вывода. Если попытаться переменной присвоить результат суммы, напишет: "C++ класс не содержит подходящий конструктор копий", хотя = перегружен тоже и работает вроде бы правильно. Знаний не хватает, чтобы даже понять что не так. Вот код:

#include "cassert"
#include "cmath"
using namespace std;

class fraction {
public:
    fraction() {
        number = 0;
        denominator = 1;
    };//конструктор по умолчаию
    ~fraction() {};//деструктор
    fraction(int num, int den) {
        bool Denominator_is_zero_or_lower_then_zero = den > 0;
        assert(Denominator_is_zero_or_lower_then_zero);
        number = num;
        denominator = den;
    };//конструктор инициализации
    fraction(fraction& fract) {
        number = fract.number;
        denominator = fract.denominator;
    };//конструктор копирования
    void reduction();
    friend ostream& operator<<(ostream& os,fraction& fract);
    friend istream& operator>>(istream& is, fraction& fract);
    fraction& operator = (fraction const fract); 
    fraction operator + (fraction const& f2);
private:
    int number;
    unsigned int denominator;
};
fraction&  fraction::operator = (fraction const fract) {
    this->number = fract.number;
    this->denominator = fract.denominator;
    return *this;
}
ostream& operator<<(ostream& os, fraction& fract) {
    if (fract.denominator - 1)
        os << fract.number << '/' << fract.denominator;
    else
        os << fract.number;
    return os;
}
istream& operator>>(istream& is, fraction& fract) {
    int num; long int den;
    if (is >> num) {
        while (((is.peek() == ' ')|| (is.peek() == '/')) && (is.peek())) {//для возможности считывание через /
            if (is.get() == '/' && (is.peek() == ' ' || isdigit(is.peek())))//проверки на / и переход на следующий символ is.get()
                break;
        }
        if (is >> den) {//проверка на отрицательный знаменатель
            if (den < 0) {
                den = -den; num = -num;
            }
            fract.number = num;//присваивание
            fract.denominator = den;
        }
        else
            assert(!"Invalid input");
    }
    else
        assert(!"Invalid input");
    return is;
}
fraction fraction::operator + (fraction const& f2)  {
    fraction fnew(this->number * f2.denominator + f2.number * this->denominator, this->denominator * f2.denominator);
    fnew.reduction();
    return fnew;
}
void fraction::reduction() {
    unsigned int numroot = abs(sqrt(this->number)) + 1; unsigned int den = this->denominator;
    for (int i = 2; (i < numroot)&&(i<den+1); ++i) 
        if (!(this->number % i)&&!(this->denominator % i)) {
            this->number /= i;
            this->denominator /= i;
        }

}
int main() {
    fraction f(9, 2); fraction a(2,2);
    cout << a + f;
    a = (a+f);
    return 0;
}```

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