文字列への暗黙的な変換を介してオブジェクトをストリーミングする際のオーバーロード解決エラー
問題の説明
暗黙的文字列への変換は一般に推奨されず、代わりにユーザー定義型の出力演算子 (<<) をオーバーロードすることをお勧めします。ただし、暗黙的な変換とオブジェクト ストリーミングを含むコードでは、オーバーロードの解決が曖昧になる可能性があります。
次の例を考えてみましょう:
<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>
エラー メッセージ
このコードを GCC 4.3.4 でコンパイルすると、次のエラーが生成されます。
prog.cpp: In function ‘int main()’: prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’
根本原因
次の組み合わせにより、オーバーロード セットには必要なオーバーロードが含まれていません。要素:
ADL 制限
引数依存ルックアップ (ADL) はこの問題に直接関与しません。 ADL は、コンパイラが関数呼び出しを解決するときに適用されるコンパイル時機能です。この場合、文字列への暗黙的な変換は、関数呼び出しを行わずにコンパイラによって実行されます。
以上が文字列への暗黙的な変換を使用してオブジェクトをストリーミングすると、オーバーロード解決エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。