Maison > Article > développement back-end > Pourquoi le streaming d'un objet avec conversion implicite en chaîne provoque-t-il un échec de résolution de surcharge ?
Échec de résolution de surcharge lors de la diffusion d'un objet via une conversion implicite en chaîne
Description du problème
Implicit la conversion en chaîne est généralement déconseillée, et la surcharge de l'opérateur de sortie (<<) pour les types définis par l'utilisateur est plutôt une approche recommandée. Cependant, le code impliquant une conversion implicite et un streaming d'objets peut entraîner une ambiguïté de résolution de surcharge.
Considérez l'exemple suivant :
<code class="cpp">struct NameType { operator std::string() { return "wobble"; } }; struct Person { NameType name; }; int main() { std::cout << "bobble"; std::cout << "wibble"; Person p; std::cout << p.name; }</code>
Message d'erreur
La compilation de ce code avec GCC 4.3.4 produit l'erreur suivante :
prog.cpp: In function ‘int main()’: prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’
Cause première
L'ensemble de surcharge n'inclut pas la surcharge souhaitée en raison d'une combinaison de facteurs :
Restriction ADL
Dépendante de l'argument lookup (ADL) n’est pas directement impliqué dans ce problème. ADL est une fonctionnalité de compilation qui s'applique lorsque le compilateur résout un appel de fonction. Dans ce cas, la conversion implicite en chaîne est effectuée par le compilateur sans aucun appel de fonction impliqué.
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!