2011-09-21 34 views

答えて

8

ここで言葉のレベルで間違っているのは、演算子にポインタを多重定義することです。オーバーロードされた演算子の少なくとも1つの引数は、ユーザー定義の型、またはその型への参照でなければなりません。

しかし、これは別のレベルでも間違っています。ポインタを返すので、おそらくオペレータにいくつかのストレージを動的に割り当てる必要があります。まあ、誰がそのストレージを所有していますか?誰がそれを解放するでしょうか?

あなただけのようなもの、参照を取り、値によって返す必要があります:

template <typename T> 
Point<T> operator +(Point<T> const& point, Vector<T> const& vector) { 
    return Point<T>(point.x + vector.x, point.y + vector.y); 
} 
+0

私がポインタを返す理由の1つは、値で返す方法を理解できなかったことです。どこからこのポイントを得るのですか?私は新しいものを作ることができず、このように返すことはできません。 –

+0

@Doug:典型的なPointクラスとVectorクラスを考慮して、例を追加しました。あなたがJavaから来たのであれば、最初に学ぶ必要があるのは、「新」が非常に頻繁に使用されることです。 –

+0

これにはどのような種類の割り当てがありますか?それは何とか呼び出し関数でスコープされていますか? –

4

基本型の演算子をオーバーロードすることはできません。どちらの場合も引数はポインタです。代わりに参照が必要でしたか?

+0

だからそれはいくつかの特定の型へのポインタだ場合でも、私はまだそれをオーバーロードすることはできませんか? –

+0

@DougTreadwell特定の型を指していないポインタを持つのは難しいでしょうか? ;) – quasiverse

+0

私は、ユーザー定義の型を指していることを意味しました。しかし、コンパイラはそれが何を指しているのか見ていないと思います。 –

4

演算子を定義するとき、少なくとも1つの引数は、ユーザー定義のクラスまたは列挙型(またはそれらのいずれかへの参照)でなければなりません。ポインタは、それらのいずれかとしての資格はありません。参照引数を使用して、修飾されていないPoint <T>を返す必要があります。

+0

正規品でないポイントはどのように返されますか? –

関連する問題