ホームページ >バックエンド開発 >C++ >C の `std::string` への暗黙的な変換でオーバーロードの解決が失敗するのはなぜですか?

C の `std::string` への暗黙的な変換でオーバーロードの解決が失敗するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-06 06:26:02630ブラウズ

Why Does Overload Resolution Fail with Implicit Conversion to `std::string` in C  ?

暗黙的な変換によるオーバーロード解決エラー

文字列への暗黙的変換を使用してオブジェクトをストリーミングしようとすると、オーバーロード解決エラーが発生する可能性があります。これは、文字列への暗黙的な変換を含む構造体と、オブジェクトを標準出力にストリーミングする関数を定義する次のコードで示されています。

<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;
}</code>

このコードを GCC 4.3.4 でコンパイルすると、次の結果が得られます。次のエラー:

prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’

このエラーは、自由関数演算子<<(ostream&, string const&) がオーバーロード セットで考慮されないために発生します。これは、テンプレートのインスタンス化と ADL (引数依存ルックアップ) である必要なオーバーロードの組み合わせによるものです。

C 98 標準セクション 14.8.1/4 では、関数の引数を変換するために暗黙的な変換が実行されると記載されています。パラメーターの型に、テンプレート引数の推定に関与するテンプレート パラメーターが含まれていない場合にのみ、対応する関数パラメーターの型に変換されます。この場合、目的のオーバーロードのすべての引数には、テンプレート引数の推論に参加するテンプレート パラメーターが含まれているため、暗黙的な変換から値を取得できるものはありません。

したがって、オーバーロードの解決は失敗し、エラーが報告されます。

以上がC の `std::string` への暗黙的な変換でオーバーロードの解決が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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