Итак, я получил перегрузку оператора внутри класса, работающую для obj1 + obj2:
fraction operator+ (fraction op);
Точно так же cout ‹‹ obj работает путем перегрузки оператора, перегружающего ostream:
ostream& operator<< (ostream& os, fraction& frac);
Однако, если я попытаюсь совместить эти две вещи, все рухнет.
fraction.cpp:77:27: error: no match for ‘operator<<’ in
‘std::operator<< [with _Traits = std::char_traits<char>]((* & std::cout), ((const char*)"Sum: "))
<< f1.fraction::operator+(f2)’
Вот код:
#include <iostream>
using namespace std;
class fraction
{
private:
int n, d;
public:
fraction ()
{
this->n = 1;
this->d = 0;
}
fraction (int n, int d)
{
this->n = n;
this->d = d;
}
int getNumerator ()
{
return n;
}
int getDenominator ()
{
return d;
}
fraction operator+ (fraction op)
{
return *(new fraction(this->n*op.d + op.n*this->d, this->d*op.d));
}
fraction operator- (fraction op)
{
return *(new fraction(this->n*op.d - op.n*this->d, this->d*op.d));
}
fraction operator* (fraction op)
{
return *(new fraction(this->n*op.n, this->d*op.d));
}
fraction operator/ (fraction op)
{
return *(new fraction(this->n*op.d, this->d*op.n));
}
};
ostream& operator<< (ostream& os, fraction& frac)
{
int n = frac.getNumerator();
int d = frac.getDenominator();
if(d == 0 && n == 0)
os << "NaN";
else if(d == 0 && n != 0)
os << "Inf";
else if(d == 1)
os << n;
else
os << n << "/" << d;
}
int main ()
{
fraction f1(2, 3);
fraction f2(1, 3);
cout << f1 << " " << f2 << endl;
/*
cout << "Sum: " << f1+f2 << endl;
cout << "Difference: " << f1-f2 << endl;
cout << "Product: " << f1*f2 << endl;
cout << "Quotient: " << f1/f2 << endl;
*/
return 0;
}
Помощь. Д:
return *(new fraction(...));
наreturn fraction(...);
. - person BoBTFish   schedule 29.07.2013new
. Возможно, вы избавитесь от своего текущего учебного материала в пользу достойного. - person R. Martinho Fernandes   schedule 29.07.2013return *(new T())
, если вы пытаетесь получить объект, просто сделайтеreturn T()
. - person 0x499602D2   schedule 29.07.2013ostream& operator<<
не возвращаетos
. - person Rapptz   schedule 29.07.2013fraction::fraction( int n, int d = 1 )
получит неявные преобразования изint
. В этом случаеoperator+
и др. не должны быть членами; обычным соглашением было бы определениеoperator+=
et al. как члены, а затемoperator+
как свободную функцию, используя+=
в своей реализации. Если у вас есть неявное преобразование иoperator+
является членом,fraction( 1, 2 ) + 3
работает, а1 + fraction( 2, 3 )
— нет. - person James Kanze   schedule 29.07.2013