Erreurs de définitions multiples dans les fichiers d'en-tête : pourquoi et comment les résoudre
Les compilateurs rencontrent des erreurs de « définitions multiples » lorsqu'ils se voient présenter plusieurs définitions d'un symbole dans le même programme. Cela peut se produire lorsque plusieurs fichiers sources incluent le même fichier d'en-tête, chacun définissant le même symbole.
Examinons l'exemple de code fourni :
// 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&, const Complex&); float m_Real; float m_Imaginary; }; std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
L'opérateur<< La fonction est définie dans le fichier .h, ce qui en fait un candidat pour une définition multiple puisque plusieurs fichiers sources l'incluront.
// 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, le compilateur rencontre une erreur « définition multiple » pour l'opérateur≪≪ function.
Pourquoi pas pour real() ?
La fonction membre real() est implicitement intégrée, ce qui signifie que le compilateur la traite comme si elle était déclarée en ligne même si il n'est pas explicitement spécifié dans le fichier .h.
Résolutions
À résoudre le problème de définition multiple pour l'opérateur<< fonction, il existe deux alternatives principales :
Inline la fonction :
Ajoutez le mot-clé inline à la définition de la fonction pour demander au compilateur de l'inline :
inline std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
Déplacez la définition vers le fichier .cpp :
Supprimez la définition de fonction du fichier .h et placez-la dans le fichier .cpp correspondant :
// complex.cpp std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
Autres solutions
Les solutions supplémentaires incluent :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!