3

単純な複素数操作用のコードを書こうとしています。テンプレートクラスを使用していますが、演算子(具体的には+、-、*、/)のオーバーロードに問題があります。テンプレートクラス内でオーバーロードを宣言し、同じヘッダーファイルでそれらを定義しようとしています。

私のヘッダーコードは次のとおりです。

#ifndef MY_CLASS_H
#define MY_CLASS_H

template <class T> class complex
{

private:
    T re,im;
public:
    // Constructors & destructor
    complex(){re=im=0;}
    complex(T r, T i){re=r; im=i;}
    ~complex(){}

    // Return real component
    T realcomp() const {return re;}
    // Return imaginary component
    T imagcomp() const {return im;}


    // Overload + operator for addition 
    complex<T> operator+(const complex<T> &C);

....

};
#endif


#include<iostream>
#include<cmath>
using namespace std;

template <class T> complex<T>& complex<T>::operator+(const complex &C){
complex<T> A(re+C.realcomp(),im+C.imagcomp());
return A;
}

これにより、これまで解決できなかったエラーが返され、どこが間違っているのか完全にはわかりません。私がC++の初心者であり、このWebサイトの他の問題の解決策をパズルで解こうとしていることは、おそらく私のコードが少し混乱していることを意味しています-申し訳ありません!

どんな助けでも大歓迎です。

4

4 に答える 4

2

の宣言complex<T>::operator+はしばらくの間を返しcomplex<T>、定義はを返しますcomplex<T>&。参照ではなく、値でオブジェクトを返したい。

また、テンプレートをインスタンス化するときにコンパイラがこれらを認識できる必要があるため、テンプレートクラスの関数定義はヘッダーファイルに含まれている必要があります。そのため、定義をヘッダーファイルに移動ますoperator+

また、コンストラクタ初期化リストを使用して、メンバー変数を初期化する必要があります。

template <class T> class complex
{
private:
    T re,im;
public:
    // Constructors & destructor
    complex() : re(), im() {}
    complex( const T& r, const T& i ) : re(r), im(i) {}
    ~complex(){}

    // Return real component
    T realcomp() const {return re;}
    // Return imaginary component
    T imagcomp() const {return im;}


    // Overload + operator for addition 
    complex<T> operator+(const complex<T> &C)
    {
       return complex<T>( re + C.realcomp(), im + C.imagcomp() );
    }
};
于 2012-04-13T15:32:34.917 に答える
0

宣言と定義が一致していません。この行を変更します。

template <class T> complex<T>& complex<T>::operator+(const complex &C){

これに

template <class T> complex<T> complex<T>::operator+(const complex &C){

(欠落している「&」に注意してください)

于 2012-04-13T15:32:19.120 に答える
0

これは機能するはずです:

template <class T> complex<T> complex<T>::operator+(const complex<T> &C){ 
  complex<T> A(re+C.realcomp(),im+C.imagcomp()); 
  return A; 
} 

戻り値がクラス内のオブジェクトであると宣言されており、パラメータにテンプレートパラメータがありません

于 2012-04-13T15:32:56.497 に答える
0

参照としてローカル変数を返します。加えて、宣言は異なります:

あなたは複合体を返すことを宣言しますが、定義上は複合体を返します&

于 2012-04-13T15:34:21.940 に答える