2009-11-13 53 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的指針。