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;}
};

主に、オーバーロードされた operator+ を使用してこれらの変換をテストします

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

コンパイラは、最後に添付された行の作業中に次のようにバグを報告します。

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

私が読んだ限りでは、オーバーロードされた関数を呼び出す方法がいくつかある場合、コンパイラは最短のものを選択します。もちろん、そのような方法は 1 つしかないはずです。operator+ を呼び出す 2 つの方法を見つけることができました。

  1. 変換変数zespkonw -> int と呼び出しoperator+(int, int)
  2. 変換定数6int->double->konw と呼び出しkonw::operator+(konw)

1 番目の方法は 2 番目よりも高速であるため、コンパイラはそれを選択して実行する必要がありますが、代わりにあいまいなオーバーロードに関するバグが記載されています。なんで?私の思考過程のどこが間違っているのでしょうか?

4

2 に答える 2