шаблонный класс не может переопределить оператор [] - PullRequest
0 голосов
/ 13 ноября 2009

У меня есть этот класс

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; (кажется, что он не видит переопределения [])

Почему ???? Чего мне не хватает?


После исправления проблемы с конструктором у меня есть компоновщик:

/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()'

вроде не может связать ... почему ??? : О

Ответы [ 3 ]

9 голосов
/ 13 ноября 2009

Проблема в вашей декларации

growVector<char> gv();

Компилятор интерпретирует это как объявление функции с именем gv, которая возвращает growVector<char>, а не как объект, который вы определяете. Поскольку конструктора по умолчанию нет, он все равно не скомпилируется. Измените его на:

growVector<char> gv(0,0);
4 голосов
/ 13 ноября 2009

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

growVector<char> gv();

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

1 голос
/ 13 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...