Использование malloc в конструкторе шаблонного класса

Допустим, у меня есть класс, который будет использоваться для создания структуры дерева или списка. Давайте назовем это

template <typename K, typename V>
class Node{
  // some data
  Node<K,V>* next;
  Node() {
    next = static_cast<Node<K,V>*>( malloc( sizeof(Node<K,V>) ));
  }
};

Делая это, я получаю следующую ошибку компилятора:

у 'malloc' нет аргументов, которые зависят от параметра шаблона, поэтому должно быть доступно объявление 'malloc' (если вы используете '-fpermissive', G++ примет ваш код, но разрешение на использование необъявленного имени устарело )

Есть ли способ использовать malloc таким образом, не используя устаревший код? Я хочу использовать malloc вместо new, потому что я хотел бы сделать там более продвинутое управление памятью.


person Kacper Madej    schedule 08.05.2012    source источник
comment
Это необычный Node класс. У вас есть то, что кажется узлом связанного списка, который автоматически выделяет следующий узел, что при нормальных обстоятельствах вызвало бы бесконечную рекурсию, но на самом деле вы используете malloc, который не вызывает конструктор создаваемого вами объекта, который останавливает рекурсия. Я не уверен, действительно ли это умно или действительно нет.   -  person Seth Carnegie    schedule 08.05.2012
comment
Вы уверены, что вам просто не хватает cstdlib? (и сказать std::malloc?)   -  person Mat    schedule 08.05.2012
comment
Похоже, вы не включаете stdlib.h, который объявляет функцию malloc.   -  person Anon Mail    schedule 08.05.2012


Ответы (2)


Ошибка компилятора говорит вам, что у него нет объявления того, что такое malloc. Вам не хватает включения, которое объявляет эту функцию.

В остальном подход нарушен. Вы пишете общее дерево, но из-за использования malloc вы ограничиваете использование типами POD (я предполагаю, что K и V хранятся в Node). Вместо этого вы должны использовать new, который будет вызывать конструктор для типа, а не просто выделять память.

person David Rodríguez - dribeas    schedule 08.05.2012
comment
Если он использует new, то он вызовет бесконечную рекурсию. Я не знаю, намеренно это или нет, что он использовал malloc. Он мог бы использовать размещение new где-нибудь, чтобы оно не ограничивалось типами POD. - person Seth Carnegie; 08.05.2012
comment
@SethCarnegie: Это правда, но я считаю, что это еще одна ошибка в реализации ... :) Нет разумного способа реализовать список с дополнительным висячим узлом в конце, malloc не гарантирует, что память будет инициализирована , что, в свою очередь, означает, что вы не можете отличить хвост от любого другого узла в списке и понятия не имеете, где остановиться в цепочке узлов. - person David Rodríguez - dribeas; 08.05.2012
comment
Это правда, но он мог бы удалить часть, которая устанавливает его в 0. Ну что ж, странный вопрос. Мир никогда не узнает. - person Seth Carnegie; 08.05.2012
comment
О, да, это было просто включение, глупый я. Типов POD для меня достаточно, потому что я просто хочу создать SkipList с хорошим трюком с памятью для моего класса «Алгоритмы и структура данных». Никакой серьезной инженерии здесь не предполагалось :). Спасибо за вашу помощь. И хорошо, есть ошибка в конструкторе, но я хотел просто спросить о malloc. Я просто написал это слишком быстро, потому что хотел просто показать проблему распределения. Извините, ребята, за мою спешку. - person Kacper Madej; 08.05.2012

Похоже, вам не хватает #include <cstdlib> или #include <stdlib.h>. Компилятор жалуется на отсутствие объявления. Включенные файлы предоставляют один.

person Magnus Hoff    schedule 08.05.2012