2

私はそのようなコードを持っています

class Number
{
    int m_value;

public :
    Number(const int value) : 
        m_value(value)
    {
    }

    operator const int() const
    {
        return m_value;
    }

    int GetValue() const
    {
        return m_value;
    }
};

bool operator==(const Number& left, const Number& right)
{
    return left.GetValue() == right.GetValue();
}

class Integer
{
    int m_value;

public :
    Integer(const int value) : 
        m_value(value)
    {
    }

    operator const int() const
    {
        return m_value;
    }

    bool operator==(const Integer& right) const
    {
        return m_value == right.m_value;
    }

    bool operator==(const int right) const
    {
        return m_value == right;
    }

    int GetValue() const
    {
        return m_value;
    }
};

bool operator==(const int left, const Integer& right)
{
    return left == right.GetValue();
}

int main()
{
    Number n1 = 1;
    Number n2 = 1;
    int x3 = 1;

    n1 == n2;
    n1 == x3; // error C2666: 'operator ==' : 3 overloads have similar conversions
    x3 == n1; // error C2666: 'operator ==' : 2 overloads have similar conversions

    Integer i4 = 1;
    Integer i5 = 1;

    i4 == i5;
    i4 == x3;
    x3 == i4;

    return 0;
}

クラスについてNumberは、上記のコードに示すように 2 つのエラーがあります。クラスについてIntegerは、すべて問題ありません。問題は、単一パラメーターのコンストラクター、キャスト演算子、等価演算 ( MyClass == intint == MyClass、 ) を結果のクラスに保持したいのですが、 as の 1 つのバージョンのみをクラスMyClass == MyClassに実装したいということです。これを行う方法がわかりません。それは可能ですか、それともクラスのように3つすべての実装が必要ですか? これらのエラーが発生する理由はわかっていますが、私が持っているソリューションが気に入らないだけです。operator==NumberInteger

4

3 に答える 3

2

クラスNumberで変換演算子を定義するintと、コンストラクターで を に変換できintますNumber。したがって、 aNumber nint xfor の等価性を比較すると、あいまいさが生じます。コンパイラは組み込みのoperator ==forを呼び出してintに変換nするint必要がありますか、それとも演算子を選択xしてNumber?に変換する必要があります。どちらの変換も同じように有効で、どちらかを選択することはできません。

したがって、はい、3 つのバージョンを定義するか、すべての引数の型を完全に一致させて、このような演算子に明示的に転送できるテンプレート演算子を追加する必要があります (ただし、enable_ifその適用性を適切なTおよびU):

template<typename T, typename U> // beware: this will match anything. to be constrained
bool operator == (T n, U const& u)
{
    return (Number(n) == Number(u));
}
于 2013-01-17T19:00:10.380 に答える
0

operator intC ++ 11では、明示的にすることができます。

もう1つのアプローチは、SFINAEを使用して、==1つ以上のNumber引数に対して機能するテンプレートを作成することですが、これは、バズーカを使用してアリを殺すことです。

于 2013-01-17T19:14:53.623 に答える
0

operator==メンバー関数として定義できるのは 1 つだけです。

bool operator==(const int& right) const
{
    std::cout << "custom\n";
    return this->GetValue() == right;
}

それで、

  • n1==n2:n2に変換されint、カスタム オペレータが使用されます。
  • n1 == n3: カスタム オペレータが使用されます
  • n3==n1: 組み込み演算子が使用されます

定数を比較できるようにしたいことに注意しoperator==てくださいconstNumber

于 2013-01-17T19:09:24.257 に答える