Учитывая этот пример кода:
complex.h:
#ifndef COMPLEX_H
#define COMPLEX_H
#include <iostream>
class Complex
{
public:
Complex(float Real, float Imaginary);
float real() const { return m_Real; };
private:
friend std::ostream& operator<<(std::ostream& o, const Complex& Cplx);
float m_Real;
float m_Imaginary;
};
std::ostream& operator<<(std::ostream& o, const Complex& Cplx) {
return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
#endif // COMPLEX_H
complex.cpp:
#include "complex.h"
Complex::Complex(float Real, float Imaginary) {
m_Real = Real;
m_Imaginary = Imaginary;
}
main.cpp:
#include "complex.h"
#include <iostream>
int main()
{
Complex Foo(3.4, 4.5);
std::cout << Foo << "\n";
return 0;
}
При компиляции этого кода возникает следующая ошибка:
multiple definition of operator<<(std::ostream&, Complex const&)
Я обнаружил, что эта функция inline
решает проблему, но я не понимаю, почему. Почему компилятор жалуется на множественное определение? Мой заголовочный файл охраняется (с #define COMPLEX_H
).
И если вы жалуетесь на функцию operator<<
, почему бы не пожаловаться на функцию public real()
, которая также определена в заголовке?
И есть ли другое решение, кроме ключевого слова inline
?