Можно ли найти размер (T) при создании шаблона в C ++? - PullRequest
1 голос
/ 04 ноября 2011

Я пытаюсь создать шаблон, который позволит мне использовать массив с изменяемым размером.Есть ли способ найти размер (T)?Я использую malloc, а не new, потому что я хочу использовать realloc в функции, которая изменяет размер массива.Это конструктор для моего класса, который получает ошибки:

template <class T>
set<T>::set(void) {
arr = malloc(10 * sizeof(T));
numElts = 0;
size = 10;
};

Я получаю следующее сообщение об ошибке при попытке построить:with:

set<int> *set1 = new set<int>();

Из проведенного мною исследования похоже, что у компилятора нет способа узнать, что использовать для sizeof (T), поэтому он не может компилироваться.Как еще я могу пойти по этому поводу?

Ответы [ 3 ]

16 голосов
/ 04 ноября 2011

malloc возвращает void*, и хотя C допускает назначение несовместимых указателей, C ++ - нет. Вам необходимо привести к T* результат malloc, предполагая, что arr определен как T*.

arr = static_cast< T* >( malloc(10 * sizeof(T)) );

Нет проблем при вызове sizeof(T) в шаблоне, если T завершен в момент создания экземпляра (а int является фундаментальным типом, он всегда завершен).

2 голосов
/ 04 ноября 2011

Конечно можно.Это не причина вашей ошибки.

Я предполагаю, что член set::arr имеет тип T*.Поскольку вы создали экземпляр класса set с типом параметра шаблона int, объявление этой переменной-члена становится int *arr;.C ++, в отличие от C , не позволяет вам неявно приводить от void * к другому типу указателя.Поэтому вам нужно привести результат вызова malloc.

arr = static_cast<T *>( malloc( 10 * sizeof(T) ) );

Кроме того, помните, что когда вы фактически вставляете элементы в набор, вам нужно использовать размещение нового чтобы создать элементы в выделенном вами буфере, а затем явно вызывать их деструкторы при копировании / перемещении / удалении.

1 голос
/ 04 ноября 2011

Я думаю, вы переоцениваете проблему.Это просто говорит вам, что вам нужно привести void*, возвращаемый malloc, к типу T* arr.

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