Maison > développement back-end > C++ > Pourquoi le streaming d'un objet avec conversion implicite en chaîne provoque-t-il un échec de résolution de surcharge ?

Pourquoi le streaming d'un objet avec conversion implicite en chaîne provoque-t-il un échec de résolution de surcharge ?

Susan Sarandon
Libérer: 2024-11-05 00:57:01
original
377 Les gens l'ont consulté

Why Does Streaming an Object with Implicit Conversion to String Cause Overload Resolution Failure?

É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>
Copier après la connexion

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’
Copier après la connexion

Cause première

L'ensemble de surcharge n'inclut pas la surcharge souhaitée en raison d'une combinaison de facteurs :

  • Instanciation de modèle : La surcharge souhaitée est une instanciation d'une fonction de modèle avec plusieurs paramètres de modèle.
  • Interdiction de conversion implicite : La conversion implicite en chaîne (NameType::operator std::string) empêche la prise en compte de la surcharge souhaitée.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal