web-dev-qa-db-ja.com

エラー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);

何か案は?

14
Byron

演算子の優先順位 ルールを忘れないでください。あなたが望むようです:

(*TempArray2)[i]

そうでない場合、式*TempArray2[i]*(TempArray2[i])と見なされ、NumericArray<T>型にはunary*演算子がオーバーロードされていないと思います。

14

*TempArray2[i]では、優先ルールにより*TempArray[2]に適用され、配列要素に単項*演算子がない可能性がかなりあります。

But動的割り当てを使用してから、値によって戻るように逆参照すると、メモリリークが発生します。
(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;
}
1
molbdnilo