2012-05-05 9 views
0

このヘッダーファイルにストリーム挿入演算子のオーバーロードに関する問題があります。コードをそのまま使用すると、タイトルにエラーメッセージが表示されます。しかし、私は、メインファイルに宣言を置く、それは正常に動作します。奇妙な宣言の動作:Rational.h:25:エラー: '&'トークンの前に予想されるコンストラクタ、デストラクタ、または型変換

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

答えて

2

iostreamあなたのRational.h

あなたは1.cに過負荷宣言を置くとき//Rational.h

#include <iostream> 

iostreamRational.hの前に含まれているので、コンパイラはタイプostreamを知っていて、エラーがありません。

ただし、Rational.hにはiostreamが含まれていないため、コンパイラはタイプostreamを知らないため、エラーが発生します。

+0

ああ、これらの診断がどれほど役立つか。 –

+0

ああ、ありがとう!私がそれについて知ったので、本当にばかな間違い。 – Saxophlutist

関連する問題