2014-10-21 12 views
8

Przeciążam operatora < < i >> w C++, ale nie mogę go skompilować.error: 'ostream' nie wymienia typu

Komunikat o błędzie: "błąd:" ostream "nie określa typu" Dlaczego pojawia się ten błąd? Jak to naprawić?

#ifndef COMPLEX_H 
#define COMPLEX_H 
#include <cstdlib> //exit 

#include <istream> 
#include <ostream> 

class Complex{ 
    public: 
    Complex(void); 
    Complex(double a, double b); 
    Complex(double a); 
    double real() const{ 
     return a; 
    } 

    double imag() const{ 
     return b; 
    } 
    friend ostream& operator<<(ostream& out,const Complex& c); 
    friend istream& operator>>(istream& in, Complex& c); 


    private: 
    double a; 
    double b; 
}; 

ostream& operator<<(ostream& out,const Complex& c){ 
    double a=c.real() , b = c.imag(); 
    out << a << "+" << b<<"i"; 
    return out; 
} 

istream& operator>>(istream& in, Complex& c){ 
    in >> c.a>> c.b; 
    return in; 
} 
#endif 

Odpowiedz

19

Używaj std::ostream i std::istream wszędzie.

ostream i istream znajdują się w przestrzeni nazw std

+0

także zasugerował czytania [? _Why jest „using namespace std;” uważane złe praktyki _] (http://stackoverflow.com/q/1452721/1870232) (jeśli przypadkowo kończy się na 'using namespace std;' dla twoich buildów! – P0W

+0

Czy przeciąłem poprawnie >> Użyłem tego w moim main.cpp: Complex c(); cin >> c; Ale nie skompiluje się jako – user2741941

+0

@ user2741941 Użyłeś 'std :: istream & operator >> (std :: istream & in, Complex & c) {...}'? – P0W

4

nami kwalifikowane nazwy dla typów zdefiniowanych w przestrzeni nazw std

friend std::ostream& operator<<(std::ostream& out,const Complex& c); 

Byłoby też lepiej, aby to <iostream> zamiast dwóch oddzielnych nagłówków <istream> i <ostream>