首页  >  文章  >  后端开发  >  为什么在 C 中隐式转换为'std::string”时重载解析会失败?

为什么在 C 中隐式转换为'std::string”时重载解析会失败?

Linda Hamilton
Linda Hamilton原创
2024-11-06 06:26:02573浏览

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’

出现此错误是因为重载集中未考虑自由函数运算符

C 98 标准部分 14.8.1/4 声明对函数参数执行隐式转换以将其转换仅当参数类型不包含参与模板实参推导的模板参数时,才转换为相应函数参数的类型。在这种情况下,所需重载的所有参数都包含参与模板参数推导的模板参数,因此它们都无法从隐式转换中获取其值。

因此,重载解析失败,并且报告错误。

以上是为什么在 C 中隐式转换为'std::string”时重载解析会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn