2012-04-13 29 views
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; 
} 

これは私がこれまでに解決することはできなかったと私は私が間違って行ってきたところ完全にはよく分からないエラーを返します。私の初心者で、私のコードがちょっと混乱していることを意味しています - 私は謝罪します。

ご協力いただければ幸いです。

+0

にエラーを投稿することができ – EdChum

答えて

2

定義がcomplex<T>&を返している間complex<T>::operator+の宣言は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()); 
    } 
}; 
+0

感謝を返す定義に複雑な中を返すように宣言します。ちょうど私が探していたもの!興味のない場合は、コンストラクタの初期化リストを使用してメンバー変数を初期化すると、どのような利点がありますか? – QuantumO

+1

@ user1331900 [この質問](http://stackoverflow.com/questions/4589237/c-initialization-lists)への答えはうまくいっています – Praetorian

0

宣言が定義と一致しませんでした。この行の変更:この

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

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

を(注意不足している "&")

0

これは動作するはずです:

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

戻り値はクラスのオブジェクトであると宣言され、patameterは、あなたが参照としてローカル変数を戻ってきている

0

テンプレートパラメータが欠落しています。プラス宣言は異なります

はあなたが複雑な&

関連する問題