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 ?

Pourquoi la surcharge des opérateurs dans un fichier d'en-tête entraîne-t-elle plusieurs erreurs de définition ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-19 05:06:02757parcourir

Why Does Operator Overloading in a Header File Lead to Multiple Definition Errors?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn