Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Kacper MadejОтветов: 2

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

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, потому что я хотел бы сделать там более продвинутое управление памятью.

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

c++templatesmalloc

Ответы

Ответ 1 · рейтинг 3 · David Rodríguez - dribeas

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

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

Ответ 2 · рейтинг 9 · Magnus Hoff

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы