Maison  >  Article  >  développement back-end  >  Pourquoi la conversion implicite d'un objet personne en chaîne entraîne-t-elle un échec de résolution de surcharge ?

Pourquoi la conversion implicite d'un objet personne en chaîne entraîne-t-elle un échec de résolution de surcharge ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-05 11:11:02541parcourir

Why Does Implicit Conversion of a Person Object to a String Result in Overload Resolution Failure?

Échec de la résolution de surcharge lors de la conversion implicite d'un objet en chaîne

Les conversions implicites de chaînes sont généralement déconseillées, une surcharge d'opérateur pour Person étant une solution plus appropriée. Cependant, examinons le code suivant pour illustrer le problème :

<code class="cpp">#include <string>
#include <ostream>
#include <iostream>

struct NameType {
   operator std::string() { return "wobble"; }
};

struct Person {
   NameType name;
};

int main() {
   std::cout << std::string("bobble");
   std::cout << "wibble";

   Person p;
   std::cout << p.name; // Error occurs here
}</code>

Le code se compile sans erreur lors de l'utilisation de GCC 4.3.4, donnant le résultat :

<code class="Bash">bobble
wibble</code>

Cependant, en essayant de convertir implicitement l'objet Person en chaîne à l'aide de << l'opérateur échoue avec une erreur de résolution de surcharge :

<code class="Bash">prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’</code>

Dans ce cas, l'opérateur << est surchargé pour gérer std::string et const char*, cependant, il n'existe pas de surcharge prédéfinie qui accepte un objet Person et le convertit implicitement en chaîne. En conséquence, le compilateur ne parvient pas à résoudre la surcharge.

Pour remédier à ce problème, vous devez définir un opérateur explicite << pour la structure Person en tant que fonction ami, permettant à la conversion implicite d'un objet Person en chaîne de fonctionner correctement.

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