erreur: opérateur surchargé & lt; & lt; ' doit être un opérateur binaire (a 3 paramètres)
Je sais qu'il ya beaucoup de questions de ce genre, mais je ne pouvais pas trouver une solution qui a fonctionné pour moi.
Je suis en train de faire simple fraction de la calculatrice que pouvez ajouter ou soustraire un nombre quelconque de fonctions et d'écrire la réponse à une réduction de la fraction.
Exemple: input=
3/2 + 4/
8
sortie =
2
Je suis en train de surcharge des opérateurs dans le but d'accomplir cette tâche.
Dans le programme, je suis en train de développer l'entrée se compose d'une expression faite de fractions séparées par les opérateurs '+'ou '-'.
Le nombre de fractions dans l'expression est arbitraire.
Chacun des 6 lignes est un exemple d'entrée valide expression:
1/2 + 3/4
1/2 -5/7+3/5
355/113
3 /9-21/ -7
4/7-5/-8
-2/-3+7/5
*Le problème que je rencontre est que lorsque je lance mon programme, il a une surcharge d'exploitation d'erreur: erreur: surcharge d'opérateur<< " doit être un opérateur binaire (a 3 paramètres)*
/Users/Spicycurryman/Desktop/ECS40/hw1/fraction.cpp:61:22: error: overloaded 'operator<<' must be a binary operator (has 3 parameters)
ostream& Fraction::operator<<(ostream &os, Fraction& n)
^
/Users/Spicycurryman/Desktop/ECS40/hw1/fraction.cpp:80:22: error: overloaded 'operator>>' must be a binary operator (has 3 parameters)
istream& Fraction::operator>>(istream &os, Fraction& n)
Je ne comprends pas pourquoi c'est une erreur.
Mon code est ci-dessous:
FICHIER CPP
#include "Fraction.h"
Fraction::Fraction(int a, int b)
{
}
int Fraction::find_gcd (int n1, int n2)
{
int gcd, remainder;
remainder = n1 % n2;
while ( remainder != 0 )
{
n1 = n2;
n2 = remainder;
remainder = n1 % n2;
}
gcd = n2;
return (gcd);
}
void Fraction::reduce_fraction(int nump, int denomp)
{
this->nump = nump;
this->denomp = denomp;
int gcd;
gcd = find_gcd(nump, denomp);
nump = nump / gcd;
denomp = denomp / gcd;
if ((denomp<0 && nump < 0 ))
{
denomp*=-1;
nump*=-1;
}
else if (denomp < 0 && nump >0){
denomp*=-1;
}
if ( denomp ==0) {
throw invalid_argument( "Error: zero denominator" );
}
}
Fraction& Fraction::operator+(const Fraction& n) {
denom = denomp * n.denom;
numera = (nump * n.numera) + (n.denom * n.nump);
return (*this);
}
Fraction& Fraction::operator-(const Fraction& n) {
denom = denomp * n.denom;
numera = (nump * n.numera) - (n.denom* n.nump);
return (*this);
}
ostream& Fraction::operator<<(ostream &os, Fraction& n)
{
if (n.numera == 0)
{
cout << 0 << endl;
return os;
}
else if (n.numera == n.denom)
{
cout << 1 << endl;
return os;
}
else
{
cout << n.numera << '/' << n.denom << endl;
return os;
}
}
istream& Fraction::operator>>(istream &os, Fraction& n)
{
char slash = 0;
return os >> n.numera >> slash >> n.denom;
}
Fichier D'En-Tête
#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
#include <stdexcept>
using namespace std;
class Fraction{
public:
Fraction(int a, int b);
int fraction(int a,int b);
int find_gcd(int n1, int n2);
void reduce_fraction(int nump, int denomp);
Fraction& operator+(const Fraction& n);
Fraction& operator-(const Fraction& n);
friend ostream& operator<<(ostream &os, const Fraction& n);
friend istream& operator>>(istream &is, const Fraction& n);
private:
int denom;
int numera;
int denomp;
int nump;
};
#endif
FICHIER PRINCIPAL RPC
#include "Fraction.h"
#include <iostream>
using namespace std;
int main()
{
Fraction x(2,3);
Fraction y(6,-2);
cout << x << endl;
cout << y << endl;
cin >> y;
cout << y << endl;
Fraction z = x + y;
cout << x << " + " << y << " = " << z << endl;
}
Je sais que les opérateurs sont des fonctions de membre et un membre de la fonction prend un implicite premier paramètre, ce qui me opérateurs maintenant prend trois paramètres, il peut être fixe étant un non-membre de la fonction; toutefois, cela ne fonctionnerait pas dans ce programme. Comment exactement dans mon cas, j'ai corrigé pour que le programme pourrait fonctionner?
Merci beaucoup!
source d'informationauteur Rohit Tigga
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous avez déclaré
operator>>
etoperator<<
en tant que non-membre de fonctions, mais définie comme une fonction membre.Cela devrait résoudre le problème (mais en ouvrir un autre ensemble de problèmes). Ainsi, au lieu de
mettre en œuvre :
Aussi, prenez note que vous avez déclaré des fonctions comme :
mais défini comme (vous avez ainsi modifié la signature) :
Bonne solution est de déclarer et de définir comme :
Je suis à l'ajout de modifications. Le reste est le même que dans la question: