1

オーバーロードされた operator+ のパラメーターとしてオブジェクトを渡そうとしていますが (クラスはテンプレート クラスです)、次のようなエラーが表示されます。

error C2955: 'Kvader': use of class template requires template argument list

これは私のクラスです:

template <class Q>
class Kvader {
private:
    Q a, b, c;
public:
    Kvader(const Kvader &temp);
    Kvader operator+(Kvader);
};

これは私のオーバーロードされた+メソッドです:

template <class Q>
Kvader Kvader<Q>::operator+(Kvader<int> temp) {
a += temp.a;
b += temp.b;
c += temp.c;
return *this;
}

と思いました

Kvader Kvader<Q>::operator+(Kvader<int> temp)

引数リストとしては十分でしょう。私は何を間違っていますか?

私のメインでは、2 つのオブジェクトを作成しているだけで (2 番目のオブジェクトはコピー コンストラクターを呼び出します)、それらを一緒に追加しようとします。

int main(){
Kvader<int> object1, object2(object1);
object1 = object1 + object2;

return 0;
}
4

1 に答える 1

1

このコードにはいくつかのエラーが含まれています。

1)Kvader<Q> Kvader<Q>::operator+(Kvader<int> temp)

戻り型の引数リストも指定する必要があります。

2)Kvader<Q> operator+(Kvader<int>);

1) と同じ + 引数の型をKvader<int>ジェネリックの代わりに変更しますKvader<Q>

3)Kvader<Q>(const Kvader<Q> &temp);

1)と同じ。

4) Kvader<Q>else の作成ステートメントがmain()失敗するためのデフォルトのコンストラクターを指定します。

5) また、operator+(const T&)演算子連鎖を可能にする参照を返す必要があります。また、不要なコピーを避けるために、通常は const 参照も使用します。

6) 最後に、これまでのように行う特別な理由がない限り、次のようなものoperator+(const Kvader<Q>&)は最初に一般的な方法で定義し、必要に応じて特殊化する必要があります。あなたが書いた方法は、オブジェクトの型をに追加できる型operator+(cont Kvader<int>&)に対してのみ機能します。おそらく達成したかったのは、特定のパラメーターを持つの特殊化を、まったく同じパラメーターを持つ に追加できるようにすることでした。次に、などの特定のタイプの特殊化を作成できます。QthisintKvaderKvaderQint

クラスと関数のテンプレートを実際に読むことをお勧めします! 確かに、時々混乱することがあります。

完全なコード:

template <class Q>
class Kvader {
private:
    Q a, b, c;
public:
    Kvader() {}
    Kvader(const Kvader<Q> &temp);
    Kvader& operator+(const Kvader<Q>& temp);
};

template <class Q>
Kvader<Q>& Kvader<Q>::operator+(const Kvader<Q>& temp) {
a += temp.a;
b += temp.b;
c += temp.c;
return *this;
}

template<class Q>
Kvader<Q>::Kvader(const Kvader<Q> &temp)
{}

int main(){
Kvader<int> object1, object2(object1);
object1 = object1 + object2;

return 0;
}
于 2016-01-31T16:53:09.543 に答える