2009-11-13 52 views
0

我有这个类模板类不能重新定义操作[]

namespace baseUtils { 

template<typename AT> 
class growVector { 

     int size; 
     AT **arr; 
     AT* defaultVal; 

    public: 

     growVector(int size, AT* defaultVal); //Expects number of elements (5) and default value (NULL) 
     AT*& operator[](unsigned pos); 
     int length(); 
     void reset(int pos); //Resets an element to default value 
     void reset();   //Resets all elements to default value 
     ~growVector(); 
}; 

} 

,这是运营商实现[]

template<typename AT> 
AT*& growVector<AT>::operator [](unsigned pos){ 
    if (pos >= size){ 
     int newSize = size*2; 
     AT** newArr = new AT*[newSize]; 
     memcpy(newArr, arr, sizeof(AT)*size); 
     for (int i = size; i<newSize; i++) 
      newArr[i] = defaultVal; 
     size = newSize; 
     delete arr; 
     arr = newArr; 
    } 
    return arr[pos]; 
} 

(是的,我不知道我不检查如果尺寸* 2> = POS ...但是这不是重点现在) 如果我使用它的代码,如:

int main() { 

    growVector<char> gv(); 
    char* x = NULL; 
    for (int i = 0; i< 50; i++){ 
     gv[i] = x; 
    } 
    gv.reset(); 
    return 0; 
} 

编译器说:

../src/base.cpp:98: warning: pointer to a function used in arithmetic 
../src/base.cpp:98: error: assignment of read-only location ‘*(gv + ((unsigned int)i))’ 
../src/base.cpp:98: error: cannot convert ‘char*’ to ‘baseUtils::growVector<char>()’ in assignment 

指的是gv [i] = x; (好像它没有看到[]的重新定义)

为什么?我错过了什么?


纠正构造问题,我已经链接sayng后:

/home/dario/workspace/base/Debug/../src/base.cpp:95: undefined reference to `baseUtils::growVector<char>::growVector(int, char*)' 
/home/dario/workspace/base/Debug/../src/base.cpp:98: undefined reference to `baseUtils::growVector<char>::operator[](unsigned int)' 
/home/dario/workspace/base/Debug/../src/base.cpp:100: undefined reference to `baseUtils::growVector<char>::reset()' 
/home/dario/workspace/base/Debug/../src/base.cpp:101: undefined reference to `baseUtils::growVector<char>::~growVector()' 
/home/dario/workspace/base/Debug/../src/base.cpp:101: undefined reference to `baseUtils::growVector<char>::~growVector()' 

喜欢它无法链接...为什么??? :o

回答

9

的问题是你的宣言

growVector<char> gv(); 

编译器将此解释为声明一个名为gv功能为您indend返回一个growVector<char>,而不是作为一个对象。由于没有默认构造函数,因此无法编译。将其更改为:

growVector<char> gv(0,0); 
+2

哈哈我真的没有看着它......对不起有什么可惜...... XD – gotch4 2009-11-13 14:03:18

4

编译器认为该行

growVector<char> gv(); 

的声明一个函数,而不是一个变量。删除(),事情应该工作。

1

我只想指出,在类中有两个版本的subscript []运算符是一个好习惯:const(它将用于r值)和非const。 你已经实现了非const的版本,但是它不能用在const函数中,或者在任何接收你的类的实例的函数中作为const引用或者指向const的指针。