2013-04-22 8 views
7

配列テンプレートクラスに*演算子を定義するために書かれた非常に簡単なプログラムがあります。 コンパイルしようとすると「違法な間接」というエラーが表示されます。 この問題に関するお手伝いをさせていただきますようお願い申し上げます。エラーC2100 - 不正な間接化

これは、オペレータの定義である:

template <typename T>                 
NumericArray<T> NumericArray<T>::operator * (const int factor) const 
{ 
NumericArray<T>* TempArray2 = new NumericArray<T>(Size()); 
for (int i=0; i<Size(); i++) 
{ 
    *TempArray2[i] = ((GetElement(i))*(factor)); 
} 
return *TempArray2; 
} 

そして、これはテスト主な機能で実装したものです:

cout<<((*intArray1)*5).GetElement(0);         
cout<<((*intArray1)*5).GetElement(1); 
cout<<((*intArray1)*5).GetElement(2); 

任意のアイデア?

答えて

10

あなたのoperator precedenceルールを忘れないでください。あなたがしたいようだ:

(*TempArray2)[i] 

は、そうでなければ、あなたの表現*TempArray2[i]*(TempArray2[i])とみなされ、私はあなたのNumericArray<T>タイプが過負荷に単項*演算子を持っていないと仮定します。 *TempArray2[i]

1

*があるため優先順位規則のTempArray[2]に適用され、配列の要素が単項*演算子を持っていないという公平な機会がありますされています。

しかし、動的割り当てを使用してから値を返すための逆参照は、メモリリークがあることを意味します。
(あなたがC++でオブジェクトを作成するnewを必要としない - あなたは、おそらくどちらかmainでそれを使用する必要はありません。)

これは良くなる(全体間接の問題を回避し)になります。

template <typename T>                 
NumericArray<T> NumericArray<T>::operator * (int factor) const 
{ 
    NumericArray<T> TempArray(Size()); 
    for (int i = 0; i < Size(); i++) 
    { 
     TempArray[i] = GetElement(i) * factor; 
    } 
    return TempArray; 
} 
関連する問題