-1

im coding with dev c++ and i get this error " $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)" in makefile.win file with the message undefined reference to `operator<<(std::ostream&, Zfraction)' when i compile my project ! the weird thing is my code worked several hours before i add the operator+, is it a problem of compiler or something ?

here is my header :

#ifndef DEF_FRACTION
#define DEF_FRACTION

#include <iostream>

class Zfraction
{
public:

Zfraction();
Zfraction(int m_numerateur, int m_denominateur);
Zfraction(int m_numerateur);
void afficher(std::ostream &flux) const;
Zfraction& operator+=(Zfraction const& fraction);
Zfraction add(Zfraction const& fraction) const;

private:

int m_numerateur;
int m_denominateur;

};
std::ostream& operator<<(std::ostream &flux, Zfraction fraction);
Zfraction operator+(Zfraction const& fraction1, Zfraction const& fraction2);
#endif

and for my cpp file :

#include "Zfraction.h"


Zfraction::Zfraction()
{
    m_numerateur=1;
    m_denominateur=0;
}

Zfraction::Zfraction(int numerateur, int denominateur)
{
    m_numerateur=numerateur;
    m_denominateur=denominateur;
}

Zfraction::Zfraction(int numerateur)
{
    m_numerateur=numerateur;
    m_denominateur=1;
}

void Zfraction::afficher(std::ostream &flux) const
{
    flux << m_numerateur<<"/"<<m_denominateur;
}

std::ostream& operator<<(std::ostream &flux, Zfraction const& une_fraction)
{
    une_fraction.afficher(flux);
    return flux;
}

Zfraction Zfraction::add(Zfraction const& fraction) const
{
    Zfraction somme;
    somme.m_numerateur=(m_numerateur*fraction.m_denominateur)+(m_denominateur*fraction.m_numerateur);
    somme.m_denominateur=m_denominateur*fraction.m_denominateur;
    return somme;
}

Zfraction operator+(Zfraction const& fraction1, Zfraction const& fraction2)
{
    Zfraction resultat;
    resultat = fraction1.add(fraction2);
    return resultat;
}
Adnane Hmunna
  • 23
  • 1
  • 3
  • 5
    Check your function signatures again. – user0042 Sep 24 '17 at 15:35
  • The linker is looking for an operator taking a `Zfraction fraction` parameter, like in the header, but only finds one taking `Zfraction const& une_fraction`. So it cannot be that one, can it? – Bo Persson Sep 24 '17 at 15:45

1 Answers1

0
std::ostream& operator<<(std::ostream &flux, Zfraction const& une_fraction)

This is the function header in the implementation.

std::ostream& operator<<(std::ostream &flux, Zfraction fraction);

This is in the header. You will notice that the final arguments do not agree.

lost_in_the_source
  • 10,998
  • 9
  • 46
  • 75