我上了一堂转换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;}
};
在main中,我使用重载的operator +
测试这些转换konw zesp(3.1, 0.6);
int ssuma = zesp + 6;
编译器在处理最后一行时说错误:
ambiguous overload for 'operator+' in 'zesp + 6'
据我所知,如果有多种方法可以调用重载函数,编译器会选择最短的函数。当然应该只有这样一种方式。我可以找到2种调用operator +的方法:
zesp
konw - > int并调用operator+(int, int)
6
int-> double-> konw并调用konw::operator+(konw)
第一种方法比第二种方法更快,因此Imo编译器应该选择它并执行,但是它会指出一个关于模糊过载的错误。为什么?我思考过程中的错误在哪里?
答案 0 :(得分:4)
选择不是“最短”或“最快”的转换序列。规则相当复杂(标准中为[ovr.ics.rank]
),但在这种情况下,两个转换序列都需要用户定义的转换,因此它们都是“用户定义的转换序列”,并且被认为同样好。第二种情况下的额外内置转换不会使情况更糟。
答案 1 :(得分:2)
您的编译器会告诉您:
int ssuma = zesp + 6;
^
prog.cpp:15:19: note: candidates are:
prog.cpp:15:19: note: operator+(int, int) <built-in>
prog.cpp:10:10: note: konw konw::operator+(konw)
因为您的所有编译器都看到:
zesp + 6
,也许我应该使用konw::operator+
并将6
转换为konw
对象” zesp
转换为int
并使用内置operator+(int, int)
” 所以你应该明确告诉编译器使用哪一个:
int ssuma = int(zesp) + 6;