Учитывая этот образец кода:множественного определения в файле заголовка
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
?
Вы также можете сделать функцию статической. Встроенный спецификатор обычно используется, чтобы заставить функцию иметь внутреннюю связь. – Akanksh
@Akanksh, на самом деле это именно то, для чего «inline». –
@Akanksh: Использование 'static' для этой цели устарело в C++. 'static' был полностью заменен анонимными пространствами имен, хотя в этом конкретном случае' inline' - это путь. –