web-dev-qa-db-fra.com

erreur: 'opérateur << surchargé doit être un opérateur binaire (a 3 paramètres)

Je sais qu'il y a beaucoup de questions comme celles-ci, mais je n'ai pas trouvé de solution qui a fonctionné pour moi.

J'essaie de faire une calculatrice de fraction simple qui peut ajouter ou soustraire n'importe quel nombre de fonctions et écrire la réponse sous forme de fraction réduite.

Exemple: entrée = 3/2 + 4/8, sortie = 2

J'essaye des opérateurs de surcharge afin d'accomplir ceci.

Donc dans le programme que j'essaye de développer, l'entrée consiste en une expression faite de fractions séparées par les opérateurs + ou -.

Le nombre de fractions dans l'expression est arbitraire.

Chacune des 6 lignes suivantes est un exemple d'une expression d'entrée valide:

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 j'ai, c'est que lorsque j'exécute mon programme, il a une erreur de fonctionnement en surcharge: * erreur: 'opérateur <<' surchargé 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 suivant 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 DU 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 membres et une fonction membre prend un premier paramètre implicite, ce qui signifie que mes opérateurs prennent maintenant trois paramètres, il peut être fixé étant une fonction non membre; cependant, cela ne fonctionnerait pas dans ce programme. Comment exactement dans mon cas pourrais-je le réparer pour que le programme fonctionne?

Merci beaucoup!

24
Rohit Tigga

Le problème est que vous avez déclaré operator>> et operator<< en tant que fonctions non membres, mais défini en tant que fonction membre.

Cela devrait résoudre ce problème (mais ouvrir un autre ensemble de problèmes). Donc au lieu de

  ostream& Fraction::operator<<(ostream &os, Fraction& n)
  {
     ...


  istream& Fraction::operator>>(istream &os, Fraction& n)
  {
     ...

mettre en œuvre en tant que:

  ostream& operator<<(ostream &os, Fraction& n)
{
...

  istream& operator>>(istream &os, Fraction& n)
{
...

Notez également que vous avez déclaré des fonctions comme:

friend ostream& operator<<(ostream &os, const  Fraction& n);
friend istream& operator>>(istream &is, const Fraction& n);

mais défini comme (donc vous avez changé la signature):

  ostream& Fraction::operator<<(ostream &os, Fraction& n)
  istream& Fraction::operator>>(istream &os, Fraction& n)

La bonne façon est de déclarer et de définir comme:

  ostream& Fraction::operator<<(ostream &os, const Fraction& n)
  istream& Fraction::operator>>(istream &os, Fraction& n)

J'ajoute juste des changements. Le reste est le même que dans la question:

class Fraction{
    friend ostream& operator<<(ostream &os, const  Fraction& n);
    friend istream& operator>>(istream &is, Fraction& n);
  // the rest is the same
};

ostream& operator<<(ostream &os, const 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&  operator>>(istream &os, Fraction& n)
{
    char slash = 0;
    return os >> n.numera >> slash >> n.denom;

}
32
BЈовић