ホームページ  >  記事  >  バックエンド開発  >  person オブジェクトを文字列に暗黙的に変換すると、オーバーロードの解決が失敗するのはなぜですか?

person オブジェクトを文字列に暗黙的に変換すると、オーバーロードの解決が失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-05 11:11:02493ブラウズ

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

オブジェクトから文字列への暗黙的な変換中にオーバーロード解決が失敗する

暗黙的な文字列変換は一般に推奨されず、Person の演算子オーバーロードがより適切な解決策です。ただし、問題を説明するために次のコードを調べてみましょう:

<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>

GCC 4.3.4 を使用するとコードはエラーなしでコンパイルされ、次の出力が得られます:

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

ただし、 << を使用して、暗黙的に Person オブジェクトを文字列に変換します。演算子はオーバーロード解決エラーで失敗します:

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

この例では、演算子 <<は std::string と const char* を処理するためにオーバーロードされていますが、 Person オブジェクトを受け入れてそれを暗黙的に文字列に変換する事前定義されたオーバーロードはありません。その結果、コンパイラはオーバーロードを解決できません。

この問題を修正するには、明示的な演算子 << を定義する必要があります。 Person 構造体をフレンド関数として使用することで、Person オブジェクトから文字列への暗黙的な変換が正しく機能するようになります。

以上がperson オブジェクトを文字列に暗黙的に変換すると、オーバーロードの解決が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。