暗黙的な文字列変換は一般に推奨されず、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 サイトの他の関連記事を参照してください。