2016-11-11 15 views
0

オーバーロードされた乗算演算子を持つ配列を作成するためのテンプレートクラスをコーディングしようとしています。テンプレートクラスの実際の内部はうまく表示されますが、*演算子のオーバーロードに問題があります。私はもともと、通常のクラスで配列を掛けるためのオーバーロードされた演算子を持っていました。ここでは、その最初のオーバーロードされた演算子をテンプレートのベースとして使用しています。テンプレートクラス配列に乗算演算子をオーバーロードする

operator * (const Array<T>& a) const; //* operator 

そして、私のメインのファイルでいただきました!これは、次のとおりです:いただきました私のヘッダファイル内

です

template <class T> 
Array<T>::operator * (const Array<T>& a) const 
{ 
    if (num != a.num) 
    { 
     cout << "Error, arrays not equal!" << endl; 
    } 

    Array<int> tmp; 
    delete[] tmp.data; 

    tmp.data = new int[cap]; 
    tmp.num = a.num; 
    tmp.cap = a.cap; 

    memcpy(tmp.data, a.data, sizeof(int)*num); 


    for(int i = 0 ; i < num ; i++) 
    { 
     tmp.data[i] = tmp.data[i] * a.data[i]; 
    } 

    return tmp; 
} 

私は受け付けており、エラーが何かがTMPと間違っていることを私に語っています。 "エラー:関数の最後に" return tmp "を参照して、 'Array'を 'int'に変換することはできません。私は

Array <int> d = a * c; 

は、配列dに関連するエラーメッセージがありますが、それらはまた、オーバーロード内のエラーに根ざしているように見えるメインで作成した2つのアレイ(AとC)を()乗算しようとしています

演算子関数。 tmpはどのように 'int'に変換されますか?

答えて

0

Array<int> tmp;Array<T> tmp;とテンプレートする必要があります。したがって、memcpy(tmp.data, a.data, sizeof(int)*num);のメモリ領域のサイズは実質的に同じになります。また、@ Thecocatriceが述べたように、あなたにはretutnタイプを追加してください。

template<typename T> 
Array<T> Array<T>::operator *(const Array<T> &a) { ... }; 

最後に表示されます。あなたは実際にそれを必要としませんmemcpy。あなたはまだループを持っているので、何の意味もありません。ただ、書き込み:

for(int i = 0 ; i < num ; i++) 
{ 
    tmp.data[i] = data[i] * a.data[i]; 
} 
0

関数に戻り値の型がありません。したがって、C++はデフォルトでintになります。 これを解決するには、関数がArray<int>(tmpのタイプ)を返すことを確認してください。

+1

を、私はそれが実際にデフォルト化を行うコンパイラであると信じて、私は(C99は、あまりにもC++はwouldntの理由もしません)標準は、その行動を禁止していると思うが、許可されたとして、これを取るいけません – Creris

関連する問題