私は、数学オブジェクトの抽象クラスを作成し、すべての演算子を定義しました。それを使用している間、私が出会った:適切な減算演算子を定義する
Fixed f1 = 5.0f - f3;
私は定義された2つだけ減算の演算子があります。
inline const Fixed operator -() const;
inline const Fixed operator - (float f) const;
を私がここに間違っているものを手に入れる - ほかには、(1 + 2 == 2 + 1)スワップに対応しています減算はしません(乗算と除算で同じです)。 私はすぐにこのよう外の私のクラスの機能を書いた:
static inline const Fixed operator - (float f, const Fixed &fp);
しかし、その後、私はキーワードfriend
を使用して、その結果、私はクラスの陰部に触れなければならないことをやっているので、これは、実行することはできません実現名前空間を「静的な」不要な関数で汚染するだけでなく、私は嫌われます。 のgcc-4.3のクラス定義の利回りの内側に、このエラーを機能の移動:
error: ‘static const Fixed Fixed::operator-(float, const Fixed&)’ must be either a non-static member function or a non-member function
GCCが示唆されているように行う、非静的な関数は次のエラーを生じ、それを作る:
error: ‘const Fixed Fixed::operator-(float, const Fixed&)’ must take either zero or one argument
なぜクラス定義内で同じ演算子を定義できないのですか?それを行う方法がない場合は、とにかくfriend
キーワードを使用していないのですか?
同じ問題を抱えているので、同じ質問が分裂する。
2のいずれかの周りに最も驚くべきコードではありませんので、実際に仕事をしていないだろう - それはあなたが行うようになる「(0.5F)を修正 - F3」が、暗黙の変換は、メンバー関数として実装された演算子のlhsには決して起こりません。実際には、「これ」は常に発信者が提供するものであり、一時的なものではありません。 –
lhsをその演算子を持つ型に変換することができれば、名前解決の全く新しい次元を持ち、標準化委員会の趣味にあまりにも多くのあいまいさが生じる理由は分かりません。 –