首页 >后端开发 >C++ >为什么流式传输隐式转换为字符串的对象会导致重载解析失败?

为什么流式传输隐式转换为字符串的对象会导致重载解析失败?

Susan Sarandon
Susan Sarandon原创
2024-11-05 00:57:01360浏览

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