2012-04-21 3 views
1

, когда я объявляю ostream < < метода перегрузки в классе моего комплексного числа, он сминает вдруг здесьostream << перегрузка давки в классе

#include<math.h> 
#include<ostream> 
#include<iostream> 

class complex 
{ 

public: 
    double getRe(); 
    double gerIm(); 
    void setRe(double value); 
    void setIm(double value); 
    explicit complex(double=0.0,double=0.0); 
    static complex fromPolar(double radius,double angle); 
    complex operator+(complex rhs); 
    complex operator-(complex rhhs); 
    complex operator*(complex rhs); 
    complex operator+(double rhs); 
    complex operator-(double rhs); 
    complex operator*(double rhs); 
    complex conjugate(); 
    double norm(); 
    complex operator/(double rhs); 
    complex operator/(complex rhs); 
    friend ostream &operator<<(ostream &out, complex c); 
private: 
    double real; 
    double img; 

}; 
ostream &operator<<(ostream &out, complex c) 
{ 
    out<<c.real<<" "; 
    out<<c.img<<" "; 
    return out; 


} 
complex operator+(double lhs,complex rhs); 
complex operator-(double lhs,complex rhs); 
complex operator*(double lhs,complex rhs); 
complex operator/(double lhs,complex rhs); 
complex exp(complex c); 
inline double complex::getRe(){return real;} 
inline double complex::gerIm(){ return img;} 
inline void complex::setRe(double value) { real=value;} 
inline void complex::setIm(double value) { img=value;} 
inline complex::complex(double re,double im) :real(re),img(im){} 
inline complex complex::fromPolar(double radius,double angle){ 

    return complex(radius*cos(angle),radius*sin(angle)); 

} 
inline complex complex::operator+(complex rhs) 
{ 
    return complex(this->real+rhs.real,this->img+rhs.img); 

} 
inline complex complex::operator-(complex rhs) 
{ 
    return complex(this->real-rhs.real,this->img-rhs.img); 

} 
inline complex complex::operator*(complex rhs) 
{ 
    return complex(this->real*rhs.real-this->img*rhs.img,this->real*rhs.img+this->img*rhs.real); 

} 
inline complex complex::operator+(double rhs) 
{ 
    return complex(this->real+rhs,this->img); 

} 

inline complex complex::operator-(double rhs) 
{ 
    return complex(this->real-rhs,this->img); 

} 
inline complex complex::operator*(double rhs) 
{ 
    return complex(this->real*rhs,this->img*rhs); 

} 
inline complex complex::operator/(double rhs) 
{ 
    return complex(this->real/rhs,this->img/rhs); 

} 
inline complex complex::operator/(complex rhs) 
{ 

    return (*this)*rhs.conjugate()/rhs.norm(); 


} 

inline double complex::norm() 
{ 
return (this->real*this->real+this->img*this->img); 
} 

inline complex complex::conjugate() 
{ 

    return complex(this->real,-this->img); 
} 


inline complex operator+(double lhs,complex rhs) 
{ 
    return rhs+lhs; 
} 

inline complex operator-(double lhs,complex rhs) 
{ 
    return complex(lhs-rhs.getRe(),rhs.gerIm()); 

} 
inline complex operator*(double lhs,complex rhs) 
{ 
    rhs*lhs; 

} 

inline complex operator/(double lhs,complex rhs) 
{ 
    return rhs.conjugate()*lhs/rhs.norm(); 

} 

ошибка говорит, что это переопределение оператора ostream, но я думаю, что я правильно написал, так что не могу понять, что происходит, пожалуйста, помогите мне

+0

Какой у вас компилятор? Я не могу воспроизвести это поведение (g ++ 4.6.2 MinGW-32bit). – Zeta

+2

Является ли это заголовочным файлом, потому что 'ostream & operator << (ostream &, complex)' - это единственная функция, которую вы не объявили 'inline'? –

+0

Кроме того, что вы подразумеваете под «внезапным раздавливанием», потому что ошибка, которую вы цитируете, звучит как компиляция или ошибка ссылки? –

ответ

4

ostream находится в std пространства имен так и в определении вашего класса вам необходимо:

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

и соответствующее определение должно выглядеть следующим образом:

std::ostream &operator<<(std::ostream &out, complex c) 
{ 
// ... 

Кроме того, вам нужно возвратить в одном из ваших operator* перегрузок:

inline complex operator*(double lhs,complex rhs) 
{ 
    return rhs*lhs; 
} 

Как вы используете имя, идентичное стандартный шаблон библиотеки библиотеки в вашем коде, вы не должны использовать using namespace std;. (Даже если это не так, вам следует избегать using namespace std; в большинстве ситуаций и, конечно же, избегать его в файлах заголовков.)

0

Если вы сделали то, что говорит Чарльз Бейли, но все же получите ошибку, убедитесь, что вы включили iostream наверху файла.

Смежные вопросы