Étant donné cet exemple de code:définition multiples dans le fichier d'en-tête
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;
}
Lors de la compilation de ce code, je reçois l'erreur suivante:
multiple definition of operator<<(std::ostream&, Complex const&)
J'ai trouvé que le fait de cette fonction inline
résout le problème, mais je ne comprends pas pourquoi. Pourquoi le compilateur se plaint-il de la définition multiple? Mon fichier d'en-tête est protégé (avec #define COMPLEX_H
). Et, si elle se plaint de la fonction operator<<
, pourquoi ne pas se plaindre de la fonction public real()
, qui est également définie dans l'en-tête?
Et existe-t-il une autre solution en plus d'utiliser le mot-clé inline
?
Vous pouvez également rendre la fonction statique. Le spécificateur en ligne est couramment utilisé pour forcer une fonction à avoir une liaison interne. – Akanksh
@Akanksh, en fait c'est exactement ce que "inline" est pour. –
@Akanksh: L'utilisation de 'static' dans ce but est obsolète en C++. 'static' a été complètement remplacé par des espaces de noms anonymes, bien que dans ce cas particulier,' inline' soit le chemin à parcourir. –