0

そのため、ストリーム挿入演算子をオーバーロードするこのヘッダー ファイルで問題が発生しています。コードをそのまま使用すると、タイトルのエラー メッセージが表示されます。しかし、宣言をメインファイルに入れると、正常に動作します。

Rational.h

#ifndef RATIONAL_H
#define RATIONAL_H

using namespace std;
class Rational{
private:
    int numerator;
    unsigned int denominator;
    bool isNegative;

public:
    Rational();
    Rational(int);
    Rational(int, int);

    bool operator==(const Rational&);
    Rational& operator++(int);          //Unused int
    Rational operator-(const Rational&);
    Rational operator+(const Rational&);
    Rational operator*(const Rational&);
    Rational operator/(const Rational&);
};

ostream& operator<<(ostream&, Rational&); //Erroneous code


#endif

必要に応じて、他の 2 つのファイル 1.c と Rational.c:

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

using namespace std;

Rational::Rational(){
numerator   = 0;
denominator = 1;
}

Rational::Rational(int num){
numerator   = num;
denominator = 1;     
}

Rational::Rational(int num, int den){
//Determine negativity
if(num < 0 xor den < 0){    //If negative
    if(num > 0){
        num *= -1;
    }
}

numerator   = num;
denominator = abs(den);  
}

bool Rational::operator==(const Rational& rhs){
return (numerator/(double)denominator == rhs.numerator/(double)(rhs.denominator));
}

ostream& operator<<(ostream& os, Rational& input){
os << "Moo";
return os;
}
/*
private:
    int  numerator;
    unsigned int  denominator;
    bool isNegative;

public:
    Rational(int, int);

    bool operator==(const Rational&);
    Rational& operator++(int);          //Unused int
    Rational operator-(const Rational&);
    Rational operator+(const Rational&);
    Rational operator*(const Rational&);
    Rational operator/(const Rational&);
*/

1.c

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

using namespace std;

int main(){
Rational test = Rational(2);

cout << test << endl;
}
4

1 に答える 1

2

あなたはあなたに含める必要がありiostreamますRational.h

//Rational.h

#include <iostream>

にオーバーロード宣言を入れると1.ciostreamが前に含まれるRational.hため、コンパイラは型ostreamを認識し、エラーはありません。

ただし、Rational.h含まれていないiostreamため、その場合、コンパイラは型ostreamを認識しないため、エラーが発生します。

于 2012-05-05T06:37:20.677 に答える