En C, les méthodes de classe peuvent être surchargées pour accepter différents types de paramètres. Cependant, il arrive parfois qu'un littéral de chaîne soit surchargé. peut correspondre de manière inattendue à la surcharge de type booléen au lieu de la surcharge std::string attendue.
Description du problème :
Supposons que nous ayons une classe Output définie comme suit :
<code class="cpp">class Output { public: static void Print(bool value) { std::cout << (value ? "True" : "False"); } static void Print(std::string value) { std::cout << value; } };</code>
Lors de l'appel de Output::Print("Hello World "), le résultat de sortie est "True" au lieu du "Hello World" attendu.
Analyse du problème :
Bien que nous ayons défini la surcharge std::string, "Hello World" est en fait une constante de tableau de caractères qui peut être implicitement convertie en booléen. Le compilateur préfère cette conversion standard au constructeur de conversion std::string défini par l'utilisateur.
Selon la norme C (§13.3.3.2/2), les ordres de conversion standards prévalent sur les ordres de conversion définis par l'utilisateur. Par conséquent, le compilateur choisit la surcharge booléenne car elle présente un meilleur ordre de conversion.
Solution :
Afin d'appeler explicitement la surcharge std::string, nous devons passer explicitement "Hello World" en tant que std::string:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
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!