Witam , mam problem ze zwróceniem obiektu klasy Fraction w przeciążeniu operatora + . Chcę zadeklarować konstruktory jako explicit ,by uniknąć niejawnych konwersji. Jednak przy próbie zwrócenia obiektu kompilator zgłasza błąd kompilacji :
...(43,37): error C2440: "return": nie można konwertować z "enbr::Fraction" na "enbr::Fraction"
...(43,37): message : Konstruktor dla class "enbr::Fraction" jest zadeklarowany jako "explicit"
Przecież zadeklarowałem i zdefiniowałem konstruktor kopiujący.Co może być nie tak ?
/// plik.h
namespace enbr {
class Fraction {
friend std::ostream& operator<<(std::ostream&, Fraction&);
private:
int numerator;
int denominator;
private:
void sgn();
void shortFrac();
void correction();
public:
Fraction();
explicit Fraction(const int,const int = 1);
explicit Fraction(const Fraction&);
explicit Fraction(Fraction&&) noexcept;
~Fraction() = default;
public:
//Fraction operator= (const Fraction&); w toku
Fraction operator+ (const Fraction&);
};
}
void enbr::Fraction::sgn() {
if ((this->numerator > 0) && (this->denominator < 0)) {
numerator *= -1; denominator *= -1;}
else if ((this->numerator < 0) && (this->denominator < 0)) {
numerator *= -1; denominator *= -1;}
}
void enbr::Fraction::shortFrac() {
int guard{1};
if (abs(this->denominator) <= abs(this->numerator))
guard = abs(this->denominator);
else guard = abs(this->numerator);
for (guard; guard > 1; guard--) {
if ((this->numerator % guard == 0) && (this->denominator % guard == 0)) {
this->numerator /= guard; this->denominator /= guard;}
}
}
void enbr::Fraction::correction() {
sgn();
shortFrac();
}
enbr::Fraction::Fraction() : numerator{0}, denominator{1}{}
enbr::Fraction::Fraction(const int num, const int den) : numerator{ num }, denominator{ den }{
correction();
if (den == 0)
throw err::ZeroDenominator{"ltr::Fraction::Fraction","usun zero z mianownika"};
}
enbr::Fraction::Fraction(const Fraction& frc)
: numerator{ frc.numerator }, denominator{ frc.denominator } {}
enbr::Fraction::Fraction(Fraction&& frc) noexcept
: numerator{ frc.numerator }, denominator{ frc.denominator } {}
enbr::Fraction enbr::Fraction::operator+ (const Fraction& frac) {
int new_num{ this->numerator * frac.denominator + this->denominator * frac.numerator};
int new_den{ this->denominator * frac.denominator };
return Fraction{ new_num, new_den }; // <- tu występuje błąd
}