Неявное преобразование в C++

294
19 декабря 2016, 20:13

Добрый вечер. У меня снова вопрос по шаблонному классу. У меня есть следующий код:

template <class T>
class List {
    static const int defaultCapacity = 20;
    static const int defaultSize = 0;
    unsigned int capacity;
    unsigned int size;
    T* list;
public:
    List() : capacity(defaultCapacity), size(defaultSize) //, list = new T[size] 
    {
        list = new T[capacity];
    }
    ~List()
    {
        delete[] list;
    }
    const T& operator[] (unsigned int i) const
    {
        return list[i];
    }
    void Add(const T& item)
    {
        if(size < capacity)
            list[size++] = item;
        else 
        {
            auto tmp = list;
            delete[] list;
            list = new T[capacity *= 2];
            memcpy(list, tmp, sizeof(tmp) * sizeof(T));
            size++;
        }
    }
    void Remove(unsigned int i)
    {
        if (i > size)
            throw std::invalid_argument("Invalid index");
        if(size > i)
            memcpy(&list[i], &list[i + 1], sizeof(T) * size - i); 
        list[--size] = 0;
    }
    void Insert(unsigned int i, const T& item)
    {
        unsigned int tempSize = size - i + 1;
        T* tmp = new T[tempSize];
        memcpy(&tmp, &list[i], sizeof(T) * tempSize);
        if(++size >= capacity)
        {
            capacity *= 2;
            delete[] list;
            list = new T[capacity];
        }
        list[i] = item;
        memcpy(&list[i + 1], tmp, tempSize); 
        delete[] tmp;
    }
    unsigned int getSize() const
    {
        return size;
    }
 };
//...
int main()
{
    auto intList = new List<int>();
    intList->Add(3);
    int i =  intList[0]; // ошибка  возникает тут
    //...       
    delete intList;
    return 0;
}

Возникает следующая ошибка: error C2440: инициализация: невозможно преобразовать "List<T>" в "int"
Но разве здесь нужно преобразование - ведь operator[] возвращает T&, то есть ссылку на int?

Answer 1
  • Объявление auto в вашем случае равносильно List<int>*, то есть объявляет тип "указатель на объект List<int>".

  • Далее, intList[0] равносильно *(intList + 0), то есть *intList, то есть разыменованному указателю на List<int>.

  • Поскольку вы пытаетесь присвоить результат разыменования указателя переменной типа int, то возникает ошибка компиляции, поскольку такое преобразование недопустимо в пределах вашей единицы трансляции.

  • Исправить это вы можете путем аллокации intList на stack'e или замены intList[0] на (*intList)[0].

READ ALSO
Com port, Аналог функции ReadFile()

Com port, Аналог функции ReadFile()

В стандартной библиотеке есть функция

286
Проблема передачи объекта в функцию на C++

Проблема передачи объекта в функцию на C++

Учу C++ на примере проекта (игра в пешки, суть и смысл игры значения не имеют)Есть объект Pawns (это обертка игры)

264
Создание окон в среде MFC

Создание окон в среде MFC

Продолжаю разбираться в MFC

258
G++ для linux: исходный код

G++ для linux: исходный код

Никак не могу найти исходный код g++ для linuxМне нужен именно исходный код

284