Biorąc pod uwagę ten przykładowy kod:stwardnienie definicja w pliku nagłówkowym
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;
}
Podczas kompilowania tego kodu, pojawia się następujący błąd:
multiple definition of operator<<(std::ostream&, Complex const&)
Odkryłam, że przeprowadzenie tej funkcji inline
rozwiązuje problemu, ale ja nie rozumiem dlaczego. Dlaczego kompilator narzeka na wiele definicji? Mój plik nagłówkowy jest strzeżony (z #define COMPLEX_H
).
A jeśli narzekają na funkcję operator<<
, dlaczego nie narzekać na funkcję public real()
, która jest również zdefiniowana w nagłówku?
Czy istnieje inne rozwiązanie oprócz użycia słowa kluczowego inline
?
Możesz również ustawić funkcję jako statyczną. Specyfikator wbudowany jest zwykle używany do wymuszenia na funkcji wewnętrznego połączenia. – Akanksh
@Akanksh, właściwie to jest właśnie to, do czego służy "inline". –
@Akanksh: Używanie 'static' do tego celu jest przestarzałe w C++. 'static' został całkowicie zastąpiony przez anonimowe przestrzenie nazw, chociaż w tym szczególnym przypadku,' inline' jest do zrobienia. –