C ++矢量模板运算符[]

时间:2012-10-09 15:25:10

标签: c++ vector operator-keyword ostream

首先,我想说这是一项硬件任务,我只是对我所面临的错误有疑问

我制作了一个带有插入函数的矢量模板,该函数将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&lt;&lt; a [1];”时,我会收到错误。

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
      ]

3 个答案:

答案 0 :(得分:5)

operator[]应该有两个版本:

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

你所拥有的是两者的奇怪组合。

你也应该回来了

return Data[index];

返回(*this)[index];会导致无限递归调用(好吧,不是无限的,在此之前你会得到一个stackoverflow)。

答案 1 :(得分:2)

这里有三个问题:

  1. 运营商优先权。 *this[index]被解析为*(this[index]),而您的意思是(*this)[index]
  2. 您正在使用const方法返回对数据的可变引用。
  3. operator[]的定义是循环的。在(*this)[index]中返回operator[]会导致无限递归。

答案 2 :(得分:1)

operator[]函数声明为常量,即它不能更改Vector对象中的任何内容。但它返回一个引用,这意味着可以修改返回的值 。这两者相互矛盾。

这可以通过从函数末尾删除const或不返回引用来解决。