Поскольку ваш файл .h включен из нескольких файлов. cpp, и каждый файл. cpp компилируется отдельно как разные единицы компиляции, а затем связывается вместе, таким образом, ваша функция оператора << будет в каждом из модули компиляции, и они конфликтуют друг с другом на этапе компоновки. </p>
Есть два варианта, если вы настаиваете оставить его в файле .h.
вариант 1:
встроить оператор <<, встроенные функции будут расширены как макросы, для функции не будет генерироваться символ, следовательно, никаких конфликтов: </p>
inline ostream & operator << (ostream &out, complex_number &cmp) {
вариант 2:
сделать < Оператор <как статическая c функция. Но вам нужно объявить функцию как stati c, прежде чем объявлять ее как друга. </p>
Причина в том, что: Цитата N3691 - §11.3 / 4 [class.friend]
A функция, впервые объявленная в объявлении друга, имеет внешнюю связь (3.5). В противном случае функция сохраняет свою предыдущую привязку (7.1.1).
complex_number.h
class complex_number;
static ostream & operator << (ostream &out, complex_number &cmp);
class complex_number
{
public:
complex_number();
complex_number(double, double);
virtual ~complex_number();
double Geta() const { return a; }
void Seta(double val) { a = val; }
double Getb() const { return b; }
void Setb(double val) { b = val; }
void print();
friend ostream & operator << (ostream &out, complex_number &cmp);
protected:
private:
double a;
double b;
};
static ostream & operator << (ostream &out, complex_number &cmp) {
double a = cmp.Geta();
....
}