1

まず、これはHWの割り当てであり、直面しているエラーに関して質問があります。

動的配列の最後にdata_typeを追加する挿入関数を使用してベクトルテンプレートを作成しました。これは私が現在持っているものです。

// Insert the value at the specified index by moving the tail
// when Size = Capacity the Vector has to be reallocated first 
// to accomate the new element
void Insert(const DATA_TYPE& value, int index){

    // If the Capacity is not large enough then ...
    // allocate large vector
    if (Size >= Capacity){
        // 0. Let's boost the capacity
         Capacity += CAPACITY_BOOST;
        // 1. Allocate new larger vector
         DATA_TYPE* newData = new DATA_TYPE[Capacity];

        // 2. Copy from old Data into the newData
         for( int i=0; i< Size; i++)
                newData[i] = Data[i];

        // 3. Delete the old Data
         delete[] Data;

        // 4. Replace old Data-pointer with the newData pointer
        Data = newData;
    }

    // Move the tail
    for(int i=index; i<Size;i++){
        Data[i+1] = Data[i];
    }

    // Insert
    Data[index] = value;
    Size++;

}
DATA_TYPE& operator[] (int index) const{
    return *this[index];
}

注:プライベート変数の使用:サイズ、容量、データ(動的配列を格納)addまたはpush_back関数を正しく実装したことは間違いありません。問題は、「cout <<a[1];」のようなものをcoutしようとするとエラーが発生することです。

while compiling class template member function 'int &Vector<DATA_TYPE>::operator [](int) const'
      with
      [
          DATA_TYPE=int
      ]
see reference to class template instantiation 'Vector<DATA_TYPE>' being compiled
     with
     [
          DATA_TYPE=int
      ]
error C2440: 'return' : cannot convert from 'const Vector<DATA_TYPE>' to 'int &'
    with
     [
        DATA_TYPE=int
      ]
4

3 に答える 3

5

あなたの 2 つのバージョンがあるはずですoperator[]:

const DATA_TYPE& operator[] (int index) const;
DATA_TYPE& operator[] (int index);

あなたが持っているのは、2つの奇妙な組み合わせです。

あなたも戻ってくるはずです

return Data[index];

戻る(*this)[index];と、無限の再帰呼び出しが発生します(無限ではなく、その前にスタックオーバーフローが発生します)。

于 2012-10-09T15:28:27.200 に答える
2

ここには 3 つの問題があります。

  1. 演算子の優先順位。あなたが意味している間、*this[index]として解析されます。*(this[index])(*this)[index]
  2. メソッドからデータへの変更可能な参照を返していますconst
  3. の定義operator[]は循環です。戻ると(*this)[index]operator[]無限再帰が発生します。
于 2012-10-09T15:31:05.760 に答える
1

operator[]関数は定数であると宣言されています。つまり、オブジェクト内の何も変更できませんVector。ただし、参照を返します。これは、返された値を変更できることを意味します。この二つは互いに矛盾しています。

これは、関数の末尾から を削除するかconst、参照を返さないようにすることで解決できます。

于 2012-10-09T15:27:48.420 に答える