2012-01-26 11 views

答えて

4

矢印演算子を別にオーバーロードする必要があります。より一般的には、たとえC++の関連する演算子間で素晴らしいマッピングがあっても、演算子のオーバーロードがあっても、残りの部分は "無償"でオーバーロードされず、自分で実装する必要があります。

T* Class::operator ->() const { 
    return &**this; 
} 

これは、その後のアドレスを取って、operator *を起動することを間接参照し、その後、レシーバオブジェクトへの参照を取得するためにthisを逆参照することによって動作します:それは逆参照の面で矢を実装するのは簡単だ、と述べた

返された参照は、矢印が適用されるべきオブジェクトへのポインタを取得します。

Boost.Operatorsライブラリを調べると、少数の基本操作から論理的に関連する多くの演算子を自動的に定義できます。

希望は役立ちます!

+0

実際にはoperator->?の "デフォルト実装"はありません。 – Paranaix

+0

@ Paranaix-いいえ、残念ながらそうではありません。より一般的には、他の関連演算子からその演算子を実装する合理的な方法があるとしても、オーバーロードされた演算子のデフォルト実装はありません(代入演算子を保存しません)。 – templatetypedef

+0

もちろん、単項 '演算子*'は 'operator->': 'return *(this-> operator->());'の形で簡単に実装できます。 C++ではどちらを他のものに関して実装するべきか、どちらがどちらかを見てからもう一方のデフォルトを提供するのか気にしません。他の演算子と同様に、複数の方法があります: 'operator- ='、または単項 'operator-'とバイナリ 'operator +'に関してバイナリ 'operator-'を実装しますか? C++では、 "基本操作"が何であるかを教えてくれませんし、あなたが思っていることを理解しようとしません。それは一貫性があり、役に立たない場合です。 –

0

あなたは本質的にオーバーロードされた逆参照演算子を実装できますが、オーバーロードされた演算子が動作するためには2回推論する必要があります。クラスXへのポインタ「E1タイプを持っている場合、 『

0

5.2.5は、』次に発現E1->E2は、等価形態(*(E1)).E2に変換されます」。問題はあなたの場合、E1ではなく、のポインタです。

関連する問題