error: el ‘operador

1 minuto de lectura

avatar de usuario
Rohit Tigga

Sé que hay muchas preguntas como estas, pero no pude encontrar una solución que me funcionara.

Estoy tratando de hacer una calculadora de fracciones simple que pueda sumar o restar cualquier número de funciones y escribir la respuesta como una fracción reducida.

Ejemplo: entrada = 3/2 + 4/ 8, salida = 2

Estoy intentando sobrecargar a los operadores para lograr esto.

Entonces, en el programa que estoy tratando de desarrollar, la entrada consiste en una expresión hecha de fracciones separadas por los operadores + o -.

El número de fracciones en la expresión es arbitrario.

Cada una de las siguientes 6 líneas es un ejemplo de una expresión de entrada válida:

1/2 + 3/4
1/2 -5/7+3/5
355/113
3    /9-21/    -7
4/7-5/-8
-2/-3+7/5

***El problema que estoy teniendo es que cuando ejecuto mi programa tiene un error de operación de sobrecarga: *error: el ‘operador

  /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)

No entiendo por qué eso es un error.

Mi siguiente código está a continuación:

ARCHIVO 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 << "https://stackoverflow.com/" << n.denom << endl;
        return os;
    }
}

  istream& Fraction::operator>>(istream &os, Fraction& n)
{
    char slash = 0;
    return os >> n.numera >> slash >> n.denom;

}

Archivo de cabecera

#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

ARCHIVO PRINCIPAL CPP

#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;
}

Sé que los operadores son funciones miembro y una función miembro toma un primer parámetro implícito, lo que significa que mis operadores ahora toman tres parámetros, puede arreglarse siendo una función no miembro; sin embargo, eso no funcionaría en este programa. ¿Cómo exactamente en mi caso lo arreglaría para que el programa funcionara?

¡Muchos gracias!

  • Podrías usar funciones de amigos que no sean miembros.

    – Frederic Hamidi

    28 de abril de 2014 a las 7:40


  • Las funciones amigas no son funciones miembro. Las funciones de miembro no tendrían necesidad de ser amigos porque ya tienen acceso privado.

    – chris

    28 de abril de 2014 a las 7:42

  • En tus operator<<( ostream& os, ... ) deberías salir a os No a cout.

    – clcto

    28 de abril de 2014 a las 7:44

  • El problema solo está relacionado con la sobrecarga de

    – Lundin

    28 de abril de 2014 a las 7:49

  • posible duplicado de ¿Cómo sobrecargar correctamente el operador

    – Lundin

    28 de abril de 2014 a las 7:50

avatar de usuario
BЈовић

El problema es que declaraste operator>> y operator<< como funciones no miembro, pero definidas como una función miembro.

Esto debería solucionar ese problema (pero abrir otro conjunto de problemas). Entonces, en lugar de

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


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

implementar como:

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

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

Además, tome nota de que declaró funciones como:

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

pero definido como (por lo tanto, cambió la firma):

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

La forma correcta es declarar y definir como:

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

Estoy agregando solo cambios. El resto es igual que en la pregunta:

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 << "https://stackoverflow.com/" << n.denom << endl;
        return os;
    }
}

  istream&  operator>>(istream &os, Fraction& n)
{
    char slash = 0;
    return os >> n.numera >> slash >> n.denom;

}

  • Cuando ejecuté el programa completamente con el archivo MAKE porque son diferentes

    -Rohit Tigga

    28 de abril de 2014 a las 9:19

  • Esto depende de dónde haya definido el operador>>, si implementa el operador en el encabezado, debe declararse en línea. En Fraction.h inline istream& operator>>(istream &os, Fraction& n) Si declara la función en Fraction.h pero la implementa en Fraction.cpp, no necesita convertirla en una función en línea. Esto puede depender del compilador.

    – Ross

    5 abr 2018 a las 20:46

  • @BЈовић, ¿cuál es el otro conjunto de problemas al que te refieres?

    – hasta el infinito

    8 de marzo de 2020 a las 19:42

¿Ha sido útil esta solución?