(C ++) Все мои перегруженные операторные функции возвращают ошибку, что они должны быть одинарными или двоичными, несмотря на то, что они друзья

Мои перегруженные классы дроби не будут компилироваться, говоря, что они должны быть унарными или бинарными. (C ++)
Обыскав вокруг, я обнаружил совет, что создание их друзей уберет неявный первый термин, но мои операторы были друзьями все это время и по-прежнему возвращают «ошибку: перегруженный« оператор- »должен быть унарным или двоичным
оператор (имеет 3 параметра) «, когда я иду на компиляцию.

Вот они в моем заголовочном файле

friend std::ostream& operator<<(std::ostream& os, const Fraction& frac); //printing
friend std::istream& operator>>( std::istream& is, Fraction& frac); // reading
friend const Fraction operator+(const Fraction& x, const Fraction& y); // adding
friend const Fraction operator-(const Fraction& x, const Fraction& y); // subtract

и вот определения для каждого из этих

std::ostream& Fraction::operator<<(std::ostream& os, const Fraction& frac) //printing
{
if(num % den == 0)
cout << num/den << endl;
else
cout << num << "/" << den << endl;
}

std::istream& Fraction::operator>>( std::istream& is, Fraction& frac) // reading
{
int pc; //peek character

is >> skipws >> num; // read numerator, skipping whitespace

pc = is.peek(); // check next character

if( is && isspace(pc))  //if whitespace after the numerator
{
while( is && isspace(pc))
{
is.get(); // eat space
pc = is.peek(); // move through the stream
}
}
else if( is && pc == '/')
{
is.get(); // eat the '/'
is >> skipws >> den;
}

if(den == 0)
{
throw invalid_argument("denominator is zero");
}

if(den < 0)
{
num = num * -1;
den = den * -1;
}
}

const Fraction Fraction::operator+(const Fraction& x, const Fraction& y) // adding
{
Fraction temp1;
Fraction temp2;
if(x.getden() == y.getden())
{
temp1.set(x.getnum() + y.getnum(), x.getden() );
}
else
{
temp1.set(x.getnum() * y.getden(), x.getden() * y.getden());
temp2.set(y.getnum() * x.getden(), y.getden() * x.getden());
temp1.set(temp1.getnum() + temp2.getnum(), temp1.getden());
}
reduceFrac(temp1);
return temp1;
}

const Fraction Fraction::operator-(const Fraction& x, const Fraction& y) // subtracting
{
Fraction temp1;
Fraction temp2;
if(x.getden() == y.getden())
{
temp1.set(x.getnum() - y.getnum(), x.getden() );
}
else
{
temp1.set(x.getnum() * y.getden(), x.getden() * y.getden());
temp2.set(y.getnum() * x.getden(), y.getden() * x.getden());
temp1.set(temp1.getnum() - temp2.getnum(), temp1.getden());
}
reduceFrac(temp1);
return temp1;

}

-4

Решение

Функции друзей не являются экземплярами класса. Они статичны и принадлежат другим классам или вообще не имеют классов.

Подружиться с ними не удалит неявный первый термин, что бы это ни значило. Делать их члены инстанции удаляет явный первый термин (сделав его неявным: this), что является вашей реальной проблемой: они являются членами, и у них есть явный первый термин. Либо сделайте их статичными, либо удалите friend и первые сроки.

Создание друзей друзей своего класса является излишним.

0

Другие решения

Других решений пока нет …