Maison > Article > développement back-end > Pourquoi la surcharge des opérateurs dans un fichier d'en-tête entraîne-t-elle plusieurs erreurs de définition ?
Définition multiple de la surcharge d'opérateur dans le fichier d'en-tête
Dans l'exemple de code fourni, le compilateur rencontre une erreur de définition multiple pour l'opérateur<< ; surcharge pour la classe Complex. Malgré la protection du fichier d'en-tête avec des protections de préprocesseur, cette erreur survient en raison de la définition de l'opérateur << fonction étant placée dans l'en-tête.
Plus précisément, la ligne std::ostream& Operator<<(std::ostream& o, const Complex& Cplx) dans le fichier d'en-tête n'est pas une déclaration, mais plutôt une définition. Par conséquent, lorsque complex.cpp et main.cpp incluent le fichier d'en-tête, le compilateur détecte les définitions en double de l'opérateur<< fonction pendant la liaison.
Contrairement à la fonction membre real(), qui est implicitement intégrée et donc non sensible à plusieurs erreurs de définition, l'opérateur<< la surcharge est explicitement définie dans le fichier d'en-tête. Par conséquent, il doit être explicitement marqué comme inline à l'aide du mot-clé inline pour permettre plusieurs définitions.
inline std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
Alternativement, la définition de l'opérateur<< La surcharge peut être déplacée vers le fichier source complex.cpp pour éviter l'erreur de définition multiple. En séparant la déclaration et la définition, le compilateur peut gérer correctement la référence à l'opérateur<< fonction dans main.cpp sans rencontrer plusieurs définitions.
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!