2011-06-24 14 views
5

これは面倒です、私はこれらのパラメータ/戻り値で関数を書くことができますが、なぜこれを行うための演算子を定義できませんか?オペレータ過負荷で2つのptrsを使用できないのはなぜですか?

-edit-私は実際にオーバーロードしようとしています<<以下は参考用です。

From msdn

// C2803.cpp 
// compile with: /c 
class A{}; 
bool operator< (const A *left, const A *right); // C2803 
// try the following line instead 
// bool operator< (const A& left, const A& right); 

GCCエラー

error: ‘bool operator<(const A*, const A*)’ must have an argument of class or enumerated type 
+0

あなたはその比較が必要な実際の状況は何ですか? –

+0

@Kerrek:私のコードはostringstreamを使用しています。私は今、私はスタックを必要とし、Oを更新することを実現します。私は参照を使用することはできませんBCの参照は変更しないでください。だから私はptrが必要です。私はすでにたくさんのコードを書いていて、o << rhsが作業を続けたいと思っています。多くのrhs varsもptrsです –

+0

代わりに 'o << * rhs'を書くことはできませんか? –

答えて

10

すべてのユーザー定義の演算子オーバーロードは、パラメータとして、少なくとも1つのユーザ定義型を必要とするため。ポイントはユーザー定義型ではありません。

C++ 03標準、§13.5 [over.oper] p6

オペレータ機能は、非静的メンバ関数であるか、非メンバ関数であり、その型クラスである少なくとも1つのパラメータを有するもののいずれかクラスへの参照、列挙、または列挙への参照

+0

しかし、彼らはしないことにしました。私はその背後にある合理的なことを知りたい。それは私の人生をより困難にする –

+0

どうして彼らは?両方のパラメータがポインタになるにはどうすればうまくいくのでしょうか?組み込み型を扱う組み込み演算子があり、その中にポインタもあります。 – Xeo

+0

AFAIK '<<'は本当に 'T *'のための何かを意味しません。そしてそれがあっても、私はそれを過負荷にするのが好きです。演算子は本当に関数です、関数は私が要求するものを行うことができます。 -edit-私の質問に私のコメントで私のコードの使用を言及 –

3

あなたは不正行為が許可されていないためです。

ポインタ型の比較演算子をオーバーライドできる場合は、これらのポインタを値(別名:実際の数値ポインタ値)と比較することはできなくなります。それは重要で、時には便利なことです。

実際のコードは< <です。なぜ私はそれを使用しない?

同じ理由でポインタはC++基本型です。ユーザー定義型ではありません。ポインタ値をもう一度左シフトできないようにしたいですか? OK、明らかにそうですが、C++はあなたを許さないでしょう。

オペレータをオーバーライドできるのは、C++にこれらのタイプのオペレータに対して既存の機能がない場合(ただし例外はありません)のみです。 C++にはすでにポインターのオペレーター<とオペレーター< <がありますので、変更することはできません。

+1

私はあなたがとにかくポインタをシフトできるとは思わない! –

+0

たぶんそれはostream演算子です... – Nemo

+0

@Nemo ...でも "ostream's <<"は...で動作します –

関連する問題