(C++) Все мои перегруженные операторные функции возвращают ошибку, что они должны быть одинарными или двоичными, несмотря на то, что они друзья
Мои перегруженные классы дроби не будут компилироваться, говоря, что они должны быть унарными или бинарными. (C++) После поиска я обнаружил совет, что подружив их, удалит неявный первый член, но мои операторы были друзьями все это время и по-прежнему возвращают "ошибку: перегруженный" operator- "должен быть унарным или бинарным оператором (имеет 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;
}
1 ответ
Функции друзей не являются экземплярами класса. Они статичны и принадлежат другим классам или вообще не имеют классов.
Подружиться с ними не удалит неявный первый термин, что бы это ни значило. Делая их экземплярами-членами, удаляет явный первый член (делая его неявным: this
), что является вашей реальной проблемой: они являются членами, и у них есть явный первый термин. Либо сделайте их статичными, либо удалите friend
и первые сроки.
Создание друзей друзей своего класса является излишним.