首頁 >後端開發 >C++ >為什麼串流隱式轉換為字串的物件會導致重載解析失敗?

為什麼串流隱式轉換為字串的物件會導致重載解析失敗?

Susan Sarandon
Susan Sarandon原創
2024-11-05 00:57:01354瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn