Динамическое распределение для структуры с шаблоном - PullRequest
1 голос
/ 27 мая 2019

У меня есть код, который является реализацией двусвязного списка.

template<class T>
struct Node{
    T value;
    struct Node * next_;
    struct Node * prev_;
};

template <class T>
class Dex
{
  public:
    struct Node<T> * head = (struct Node<T> *)calloc(1, sizeof(struct Node<T>));
    struct Node<T> * tail = (struct Node<T> *)calloc(1, sizeof(struct Node<T>));
    struct Node<T> * current = (struct Node<T> *)calloc(1, sizeof(struct Node<T>));

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

[Ошибка] нет никаких аргументов для 'calloc', которые зависят от параметра шаблона, поэтому должно быть доступно объявление 'calloc' [-fpermissive]

Я пробовал malloc, new и т. Д. Но я хочу придерживаться calloc () для этого. Любой другой метод выделения памяти приветствуется, если он работает и не генерирует SIGSEV.

Я ожидаю, что код успешно скомпилируется и сможет инициализировать указатель (struct Node *), не сталкиваясь с проблемами с памятью.

1 Ответ

1 голос
/ 27 мая 2019

Кажется, вам просто не хватает необходимого ключа:

#include <cstdlib>

Однако вы можете использовать new для этого.Практически нет причин использовать calloc() в C ++.Для инициализации по умолчанию при выделении с помощью new, используйте:

Node<T> * head = new Node<T>();
Node<T> * tail = new Node<T>();
Node<T> * current = new Node<T>();

() в конце будет инициализировать элементы структуры по умолчанию.Для встроенных типов он обнуляет их так же, как и calloc().

Не по теме:
Вам не нужно вводить struct перед именем структуры в C ++.Вы можете изменить свой код на:

template<class T>
struct Node {
    T value;
    Node * next_;
    Node * prev_;
};

template <class T>
class Dex {
public:
    Node<T> * head = new Node<T>();
    Node<T> * tail = new Node<T>();
    Node<T> * current = new Node<T>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...