2016-11-10 7 views
1

私は演算子のオーバーロードに問題があります。
私はこのような演算子を持つクラスを書きたい:C++テンプレートのオーバーロードのためのあいまいなオペレータ

class BigNum 
{ 
    public: 
     template<class T> 
     bool operator==(const T &input); 
     template<class T> 
     friend bool operator==(const T &A,BigNum & B); 
}; 

それが呼び出すために罰金です:

BigNum A; 
int a; 
A==a; 
a==A; 

しかし、呼び出し:

BigNum A,B; 
A==B; 

コンパイルエラー:

[Error] ambiguous overload for 'operator==' (operand types are 'BigNum' and 'BigNum')
[Note] bool BigNum::operator==(const T&) [with T = BigNum]
[Note] bool operator==(const T&, BigNum&) [with T = BigNum]

そして、私は

bool operator==(const BigNum &input); 

template<class T> 
bool operator==(const T &input); 

を変更しかし、オペレータのオーバーロードは、このようなものです(それはAny type==BigNumを行うことができない)場合、それはOKであれば、同じ問題があります:

class BigNum 
{ 
    public: 
     bool operator==(const BigNum &input); 
     template<class T> 
     bool operator==(const T &input); 
}; 

それはこれらのすべてを行うことができるように演算子オーバーロードを書きたい:

  • あらゆるタイプ== BIGNUM
  • BIGNUMはどのようにすべき任意のタイプ
  • BIGNUM == BIGNUM

を==それを修正する?ありがとう。

+0

2つの 'BigNum'をとるテンプレートではなく、片側に' BigNum'、もう片側に 'T'をとるテンプレートが2つ必要です(' BigNum'を左に取るテンプレートはメンバ代わりに機能しますが、個人的には、3つの非メンバーをすべて対称性のために作っています)。 –

+0

「電話するのは大丈夫ですが:...しかし、呼び出したとき:...エラー...」というコードには、代入演算子「=」がありません。同値ではありません。== ' – doctorlove

答えて

1

私はメンバー==テンプレートを削除示唆し、ちょうどoperator==のために3つの非メンバーのオーバーロードを提供する - テンプレート2、それで別の右側に左側にBigNum、と1。一方はBigNumでテンプレート化されていません。

+0

ありがとうございます。 – Ryan

関連する問題