"невозможно преобразовать 'SinglyLinkedList<int>:: node *' в 'int*', когда компиляция назначения прекращена из-за -Wfatal-errors."

Ошибка

t.cpp: В конструкторе 'SinglyLinkedList::SinglyLinkedList(T*, size_t) [с T = int]': t.cpp:29: создается здесь Строка 51: ошибка: невозможно преобразовать 'SinglyLinkedList::node*' в 'int*'в компиляции присваивания прекращено из-за -Wfatal-ошибок.

в строке, показанной ниже

   node * lastNode = new node;
   lastNode->val = *arr;
   lastNode->next = NULL;
   for (T * pa(arr+1), * pb(arr+n); pa != pb; ++pa)
   {
      node * thisNode = new node;
      thisNode->val = *pa;
      thisNode->next = NULL;
      lastNode->next = thisNode; // error 
      lastNode = thisNode;
      delete thisNode;      
   }

Полный код здесь: http://codepad.org/gZ2KnrUM

Не могу понять, что синтаксически неверно в этой строке.

Бонусный вопрос: есть ли способ кратковременной инициализации struct с new? Я хочу быть в состоянии сделать такие строки, как

node * lastNode = new node;
lastNode->val = *arr;
lastNode->next = NULL;

в одну строку, если это возможно. Я знаю, что если бы я создал его в стеке, то я мог бы сделать

node lastNode = { *arr, NULL m}; 

но есть ли эквивалентная инициализация скобки для создания с new?

2 ответа

Решение

Вы пытаетесь назначить тип node * к переменной типа int *,

Ваш код узла для узла должен быть:

struct node 
{  
    T val;
    node * next;
};

Что касается "краткой инициализации", я бы просто использовал конструктор.

class node 
{ 
    T val;
    node * next;

public:
    node(T val, node * next)
    : this->val(val)
    , this->next(next)
    {};
};

node * lastNode = new node(*arr, nullptr);

Или инициализатор C++11:

node * lastNode = new node { *arr, nullptr };

Ошибка на линии

lastNode->next = thisNode;

и ошибка в том, что

cannot convert 'SinglyLinkedList::node*' to 'int*' in assignment

я могу увидеть это thisNode имеет тип node*и из сообщения об ошибке я заключаю, что next является переменной-членом типа int*,

Таким образом, либо это объявление неверно, либо ваша идея присвоения node* в next плохо продуман.

Что касается вашего второго вопроса (который на самом деле должен быть другим вопросом, а не задавать два вопроса одновременно), вы можете либо дать своей структуре конструктор, либо обновить ее до C++11 и делать new node{*arr, nullptr},

Другие вопросы по тегам