関数宣言:C++コンパイラエラーの原因:クラスまたは列挙型の引数が必要ですか?
template <typename T>
Point<T>* operator +(Point<T> const * const point, Vector<T> const * const vector);
私はので、多分私は本当に愚かな何かをやっているC++を使用していたので、それはしばらくしています。お知らせ下さい。
また、いいえ、私は名前空間stdを使用していません。
関数宣言:C++コンパイラエラーの原因:クラスまたは列挙型の引数が必要ですか?
template <typename T>
Point<T>* operator +(Point<T> const * const point, Vector<T> const * const vector);
私はので、多分私は本当に愚かな何かをやっているC++を使用していたので、それはしばらくしています。お知らせ下さい。
また、いいえ、私は名前空間stdを使用していません。
ここで言葉のレベルで間違っているのは、演算子にポインタを多重定義することです。オーバーロードされた演算子の少なくとも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);
}
基本型の演算子をオーバーロードすることはできません。どちらの場合も引数はポインタです。代わりに参照が必要でしたか?
だからそれはいくつかの特定の型へのポインタだ場合でも、私はまだそれをオーバーロードすることはできませんか? –
@DougTreadwell特定の型を指していないポインタを持つのは難しいでしょうか? ;) – quasiverse
私は、ユーザー定義の型を指していることを意味しました。しかし、コンパイラはそれが何を指しているのか見ていないと思います。 –
演算子を定義するとき、少なくとも1つの引数は、ユーザー定義のクラスまたは列挙型(またはそれらのいずれかへの参照)でなければなりません。ポインタは、それらのいずれかとしての資格はありません。参照引数を使用して、修飾されていないPoint <T>を返す必要があります。
正規品でないポイント
私がポインタを返す理由の1つは、値で返す方法を理解できなかったことです。どこからこのポイントを得るのですか?私は新しいものを作ることができず、このように返すことはできません。 –
@Doug:典型的なPointクラスとVectorクラスを考慮して、例を追加しました。あなたがJavaから来たのであれば、最初に学ぶ必要があるのは、「新」が非常に頻繁に使用されることです。 –
これにはどのような種類の割り当てがありますか?それは何とか呼び出し関数でスコープされていますか? –