4

我有一个转换类 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'

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

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

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

4

2 回答 2

4

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

于 2013-10-10T12:07:40.460 回答
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+并转换6konw对象”
  • “等等,我也可以转换zespint使用内置的operator+(int, int)

所以你应该明确告诉编译器使用哪一个:

int ssuma = int(zesp) + 6;
于 2013-10-10T12:06:52.863 回答