操作员+使用转换的模糊过载

时间:2013-10-10 11:56:53

标签: 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;}
};

在main中,我使用重载的operator +

测试这些转换
konw zesp(3.1, 0.6);
int ssuma = zesp + 6;

编译器在处理最后一行时说错误:

ambiguous overload for 'operator+' in 'zesp + 6'

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

  1. 转换变量zesp konw - > int并调用operator+(int, int)
  2. 转换常量6 int-> double-> konw并调用konw::operator+(konw)
  3. 第一种方法比第二种方法更快,因此Imo编译器应该选择它并执行,但是它会指出一个关于模糊过载的错误。为什么?我思考过程中的错误在哪里?

2 个答案:

答案 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;