Too many parameters for this operator function

May 22, 2020 at 9:27am
Hello,

I don't want to use a friend keyword for + operator overloading.
I have an error in line 35.

How can I fix it?

Thanks


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
using namespace std;

class Fraction
{
private:
	int numerator;
	int denominator;

	Fraction Add(Fraction f1, Fraction f2)
	{
		int denominator3 = gcd(f1.denominator, f2.denominator);

		denominator3 = (f1.denominator * f2.denominator) / denominator3;

		int numerator3 = (f1.numerator) * (denominator3 / f1.denominator) + (f2.numerator) * (denominator3 / f2.denominator);
		Simplify(numerator3, denominator3);
		Fraction f; f.numerator = numerator3; f.denominator = denominator3;
		return f;
	}

	int gcd(int a, int b) {
		if (a == 0 || b == 0)
			return 0;
		else if (a == b)
			return a;
		else if (a > b)
			return gcd(a - b, b);
		else return gcd(a, b - a);
	}
public:
	friend ostream& operator<<(ostream& os, const Fraction& f);
	friend istream& operator>>(istream& in, Fraction& f);

	Fraction operator + (Fraction const &f1, Fraction& const f2) // ERROR -   Too many parameters for this operator function

	{
		 return Add(f1, f2);
	}

	void Simplify(int n, int d)
	{
		int myGcd = gcd(n, d);
		n = n / myGcd;
		d = d / myGcd;
	}

};
ostream& operator<<(ostream& os, const Fraction& f)
{
	os << f.numerator << "/" << f.denominator << endl;
	return os;
}
istream& operator>>(istream& in, Fraction& f)
{
	cout << "Numerator: ";
	in >> f.numerator;
	cout << "Deniminator: ";
	in >> f.denominator;

	return in;
}
int main()
{
	Fraction f1;
	Fraction f2;

}
Last edited on May 22, 2020 at 9:28am
May 22, 2020 at 9:53am
Operators are syntactic sugar that allow you to write
1
2
3
lhs op rhs
// rather than
op( lhs, rhs )

Member functions have implicit parameter:
1
2
3
4
obj.mem( param );
// rather than
T func( U *this, V param );
func( &obj, param );


You have written
Fraction Fraction::operator+ (Fraction const &f1, Fraction& const f2)
That would correspond to standalone
Fraction operator+ ( Fraction &obj, Fraction const &f1, Fraction& const f2)
Would you write:
1
2
3
4
5
Fraction f1;
Fraction f2;
Fraction f3;
Fraction f4;
f4 = f3 + f1 f2; // ???? 


Solution for binary operators:
1
2
3
4
5
Fraction Fraction::operator op ( Fraction& const rhs ) const
{
  // lhs IS *this
  // ...
}


Canonical way to write those operators is standalone, implemented with member compound operators:
1
2
3
4
5
Fraction operator + ( Fraction lhs, const Fraction& rhs )
{
  lhs += rhs
  return lhs;
}

Requires public member:
1
2
3
4
Fraction& Fraction::operator += ( Fraction& const rhs )
{
  // ...
}

Topic archived. No new replies allowed.