ホームページ >バックエンド開発 >C++ >文字列への暗黙的な変換を使用してオブジェクトをストリーミングすると、オーバーロード解決エラーが発生するのはなぜですか?

文字列への暗黙的な変換を使用してオブジェクトをストリーミングすると、オーバーロード解決エラーが発生するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-05 00:57:01353ブラウズ

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

文字列への暗黙的な変換を介してオブジェクトをストリーミングする際のオーバーロード解決エラー

問題の説明

暗黙的文字列への変換は一般に推奨されず、代わりにユーザー定義型の出力演算子 (<<) をオーバーロードすることをお勧めします。ただし、暗黙的な変換とオブジェクト ストリーミングを含むコードでは、オーバーロードの解決が曖昧になる可能性があります。

次の例を考えてみましょう:

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

根本原因

次の組み合わせにより、オーバーロード セットには必要なオーバーロードが含まれていません。要素:

  • テンプレートのインスタンス化: 必要なオーバーロードは、いくつかのテンプレート パラメーターを含むテンプレート関数のインスタンス化です。
  • 暗黙的な変換禁止 : 文字列 (NameType::operator std::string) への暗黙的な変換により、必要なオーバーロードが考慮されなくなります。

ADL 制限

引数依存ルックアップ (ADL) はこの問題に直接関与しません。 ADL は、コンパイラが関数呼び出しを解決するときに適用されるコンパイル時機能です。この場合、文字列への暗黙的な変換は、関数呼び出しを行わずにコンパイラによって実行されます。

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

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