c++ - 使用转换的 operator+ 的模糊重载

标签 c++

我得到了一个转换 konw -> int, double -> konw 的类:

class konw {
    double re, im;
public:
    konw() : re(0.0), im(0.0) {}
    konw(double r, double i = 0.0) : re(r), im(i) {}
    operator int() {return re;}
    konw operator+(konw a) {konw wynik; wynik.re = re + a.re; wynik.im = im + a.im; return wynik;}
};

主要是我使用重载的 operator+ 测试这些转换

konw zesp(3.1, 0.6);
int ssuma = zesp + 6;

编译器在处理最后一行时指出了一个错误:

“zesp + 6”中“operator+”的模糊重载

据我所知,如果有多种调用重载函数的方法,编译器会选择最短的一种。当然应该只有一种这样的方式。我可以找到两种调用 operator+ 的方法:

  1. 转换变量 zesp konw -> int 并调用 operator+(int, int)
  2. 转换常量 6 int->double->konw 并调用 konw::operator+(konw)

第一种方法比第二种方法快,所以编译器应该选择它并执行,但它指出了一个关于不明确重载的错误。为什么?我的思考过程哪里出错了?

最佳答案

选择不是“最短”或“最快”的转换序列。规则相当复杂(标准中的[ovr.ics.rank]),但在这种情况下,两个转换序列都需要用户定义的转换,因此它们都是“用户定义的转换序列"并被认为同样优秀。第二种情况下额外的内置转换不会使情况变得更糟。

关于c++ - 使用转换的 operator+ 的模糊重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19295121/

相关文章:

c++ - "Variable"未在此范围内声明

c++ - 使用 enable_if 选择性地添加结构成员

C++ 将文件读入数组/列表/vector

c++ - 如果您在 .h 文件中包含某些内容,您是否必须再次包含相同的内容?

c++ - 为什么mpfr_printf与printf的十六进制 float (%a转换说明符)不同?

c++ - 带有 TTF 的 SDL 内存泄漏

c++ - 我可以获取控制台窗口中所选文本的位置(C++)吗?

c++ - 我无法弄清楚我用Kruskal算法实现MST出了什么问题

c++ - C++ 中的运行时运算符

c++ - 在 C++ 中将智能指针放入类数据(作为类成员)的正确方法是什么?