我得到了一个转换 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+ 的方法:
- 转换变量
zesp
konw -> int 并调用operator+(int, int)
- 转换常量
6
int->double->konw 并调用konw::operator+(konw)
第一种方法比第二种方法快,所以编译器应该选择它并执行,但它指出了一个关于不明确重载的错误。为什么?我的思考过程哪里出错了?
最佳答案
选择不是“最短”或“最快”的转换序列。规则相当复杂(标准中的[ovr.ics.rank]
),但在这种情况下,两个转换序列都需要用户定义的转换,因此它们都是“用户定义的转换序列"并被认为同样优秀。第二种情况下额外的内置转换不会使情况变得更糟。
关于c++ - 使用转换的 operator+ 的模糊重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19295121/