-1

ここで、関係演算子をオーバーロードしようとしています。オーバーロードされた関数をクラスの 2 つのオブジェクトに適用すると機能しますが、オブジェクトと float 値に適用すると、「「double」から「distance」への変換があいまいです」というエラーが表示されます。助けてください。

#include <iostream>

using namespace std;

class Distance
{
    int iFeet;
    float fInches;
public:
    Distance(const float);
    Distance(const int = 0, const int = 0);
    bool operator >(const Distance);
};

Distance::Distance(const float p)
{
    iFeet = int(p);
    fInches = (p - iFeet) * 12;
}

Distance::Distance(const int a, const int b)
{
    iFeet = a;
    fInches = b;
}

bool Distance::operator>(const Distance dd1)
{
    if (iFeet > dd1.iFeet)
        return true;
    if (iFeet == dd1.iFeet && fInches > dd1.fInches)
        return true;

    return false;
}

int main()
{
    Distance D(1, 6), D2(1, 8);
    if (D > D2)
        cout << "D is gtreater than D2" << endl;
    else
        cout << "D2 is greater than D" << endl;

    if (D > 5.6)
        cout << "D is greateer" << endl;
    else
        cout << "D is not greater" << endl;
    return 0;
}
4

4 に答える 4

1

あなたは右側のオペランドとしてoperator>a を取るので、それを a に渡す場合、変換が必要です。Distancedouble

問題は、2 つのコンストラクトがあることです

Distance(const float);
Distance(const int = 0, const int = 0);

の型は5.6ですdouble。両方のコンストラクターが候補であり (1 つの引数で呼び出すことができるため)、必要な変換 (double -> floatおよびdouble -> int) はどちらも他のものより優れていません。したがって、呼び出しがあいまいであるというエラー。

于 2013-10-22T11:01:18.853 に答える
0

オーバーロードされたものは、2 つのオブジェクトoperator >間の比較にのみ機能します。Distance

左辺はすでにDistance,Dです。

右側はdouble,5.6

コンパイラは を に変換しようとしdoubleますDistanceが、適切なコンストラクタがありません。0、1、または 2の sを取る aconst floatおよび one を取るコンストラクターがあります。const intコンパイラは 2 つから選択できないため、エラーが発生します。

これは、いくつかの方法で解決できます。

  1. float、 を渡し5.6fます。
  2. floatyourを a に明示的にキャストしますdoublestatic_cast<float>(5.6)
  3. を取るコンストラクタを提供しますdouble
  4. operator >を取る を指定しますdouble
  5. テンプレート化された型を取るコンストラクターを提供します。
  6. operator >テンプレート化された型を取る を提供します。
于 2013-10-22T11:00:52.777 に答える
0

コンストラクターは、float(最初の引数を介して) またはint(2 番目の既定の引数を使用して) からの変換を許可します。を変換しようとしていますが5.6、これは でありdouble、どちらのコンストラクターも同等に一致します。したがって、エラー。

1 つのオプションは、それを使用するfloatint、初期化することです。に変更5.65.6fます。

別のオプションは、2 番目のコンストラクターから既定の引数を削除して、変換に使用できないようにすることです。デフォルトのコンストラクターが必要な場合は、コンストラクターを追加するか、デフォルトの引数を変換コンストラクターに追加します。

その他のオプションは、から変換または比較するオーバーロードをさらに追加することdoubleです。しかし、それはかなり面倒になり始めます。

于 2013-10-22T11:03:47.933 に答える