2009-11-13 3 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> = поз ... но это не главное сейчас) , если я использую его в коде, как:

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, которая возвращает growVector<char>, а не как объект, как вы indend. Поскольку конструктор по умолчанию не существует, это все равно не будет компилироваться. Измените его на:

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

lol я действительно не смотрел на это ... извините, какой позор ... XD – gotch4

4

компилятор считает эту строку

growVector<char> gv(); 

объявляет функцию, а не переменной. Снимите (), и все должно сработать.

1

Я просто хотел бы отметить, что хорошая практика состоит в том, чтобы иметь две версии оператора subscript [] в классе: const (который будет использоваться для r-значения) и не const. Вы внедрили неконстантную версию, но ее нельзя использовать в конструкциях const или в любой функции, которая получает экземпляр вашего класса в качестве ссылки на const или указателя указателя на const.

Смежные вопросы