How do I fix "undefined reference to operator<<(std::ostream&, Rational&)" in visual studio code

Viewed 16

I was previously running into an issue that said main.exe doesn't exist when I try including header files. I changed the tasks.json file and included "${fileDirname}\\Rational.cpp". And I was able to use the other methods such as adding and subtracting. But then I tried using the overloaded operator<< and operator>> methods. And I was getting undefined method error in the terminal and vscode doesn't detect it during compilation (No red squiggles). When I run the code the following screen pops up:

Error pop up

And this is my task.json:

tasks.json

Here is my code:

Rational.h

#ifndef RATIONAL_H
#define RATIONAL_H

#include <iostream>

using namespace std;

class Rational {

    public:
        Rational();
        Rational(int, int);
        //Rational(int = 0, int = 1);
        Rational(const Rational &orig);
        int getNumerator();
        int getDenominator();
        void setNumerator(int);
        void setDenominator(int);
        void setRational(int, int);
        Rational operator+(Rational);
        Rational operator-(Rational);
        Rational operator*(Rational);
        Rational operator/(Rational);
        friend ostream& operator<<(ostream&, Rational&);
        friend istream& operator>>(istream&, Rational&);

    private:
        int numerator;
        int denominator;
        void reduce();

};

#endif

Rational.cpp

#include "Rational.h"

using namespace std;

Rational::Rational() {
    setRational(0, 1);
}

Rational::Rational(int numerator, int denominator) {
    setRational(numerator, denominator);
}

Rational::Rational(const Rational& orig) {
    setRational(orig.numerator, orig.denominator);
}

int Rational::getNumerator() {
    return numerator;
}

int Rational::getDenominator() {
    return denominator;
}

void Rational::setNumerator(int numerator) {
    this->numerator = numerator;
}

void Rational::setDenominator(int denominator) {
    if (denominator == 0) {
        this->denominator = 1;
    }
    else {
        this->denominator = denominator;
    }
}

void Rational::setRational(int numerator, int denominator) {
    setNumerator(numerator);
    setDenominator(denominator);
    reduce();
}

void Rational::reduce() {

    int min = (numerator < denominator) ? numerator : denominator;

    for (int i = 2; i <= min; ) {
        if (numerator % i == 0 && denominator % i == 0) {
            numerator /= i;
            denominator /= i;
        }        
        else {
            i++;
        }
    }
}

Rational Rational::operator+(Rational r) {
    Rational result = Rational(this->numerator * r.denominator + r.numerator * this->denominator, 
                this->denominator * r.denominator);
    return result;
}

Rational Rational::operator-(Rational r) {
    Rational result = Rational(this->numerator * r.denominator - r.numerator * this->denominator, 
                this->denominator * r.denominator);
    return result;
}

Rational Rational::operator*(Rational r) {
    Rational result = Rational(this->numerator * r.numerator, this->denominator * r.denominator);
    return result;
}

Rational Rational::operator/(Rational r) {
    Rational result = Rational(this->numerator / r.numerator, this->denominator / r.denominator);
    return result;
}

ostream& operator<<(ostream &out, Rational r) {
    out << r.getNumerator() << "/" << r.getDenominator() << endl;
    return out;
}

istream& operator>>(istream &in, Rational r) {
    int numerator;
    cout << "Enter the numerator: ";
    in >> numerator;
    int denominator;
    cout << "Enter the denominator: ";
    in >> denominator;

    r.setNumerator(numerator);
    r.setDenominator(denominator);
    return in;
}

main.cpp

#include <iostream>
#include "Rational.h"

using namespace std;

int main() {

    Rational r1(2, 4);
    Rational r2(2, 5);

    Rational r3;
    cin >> r3;

    Rational r4(r1);

    cout << "R1: " << r1 << endl;
    cout << "R2: " << r2 << endl;
    cout << "R3: " << r3 << endl;
    cout << "R4: " << r4 << endl;

    r4 = r1 + r2;
    cout << "r1 + r2 = " << r4 << endl;
    r4 = r1 - r2;
    cout << "r1 - r2 = " << r4 << endl; 

    return 0;
}
0 Answers
Related