(C ++) Получение следующей ошибки компиляции: невозможно преобразовать DoubleNode <int>в DoubleNode <int>* при инициализации - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь скомпилировать программу с двойными связями, и в функции вставки возникает следующая ошибка:

DoublyLinkedList.cpp:23:26: error: cannot convert 'DoubleNode<int>' to 'DoubleNode<int>*' in initialization
   23 |    DoubleNode<ItemType>* prevPtr = getAtPos(position - 1);
      |                          ^~~~~~~
      |                          |
      |                          DoubleNode<int>

Соответствующие строки кода:

DoubleNode<ItemType>* newNodePtr = new DoubleNode<ItemType>(item);
if (position == 1){
    // insert new double node at the begining of the chain
    newNodePtr->setNext(headPtr);
    headPtr = newNodePtr;
}
else{
    // find node that will be before new node
    DoubleNode<ItemType>* prevPtr = getAtPos(position - 1);
    newNodePtr->setNext(prevPtr->getNext());
    prevPtr->getNext()->setPrev(newNodePtr);
    newNodePtr->setPrev(prevPtr);
    prevPtr->setNext(newNodePtr);

Функция getAtPost:

template<class ItemType>
DoubleNode<ItemType> DoublyLinkedList<ItemType>::getAtPos(const int& position) const
{
    // count from begining of chain
    DoubleNode<ItemType>* curPtr = headPtr;
    for (int i = 1; i < position; i++){
        curPtr = curPtr->getNext();
    }
    return *curPtr;
}  // end getAtPos

1 Ответ

0 голосов
/ 07 апреля 2020

Ваш метод getAtPos() возвращает копию объекта DoubleNode<ItemType> из списка, а не возвращает указатель на исходный объект, что и является вызывающей стороной на самом деле ожидание.

Вы также не обрабатываете возможность параметра position, указывающего индекс, выходящий за пределы списка.

Попробуйте вместо этого:

template<class ItemType>
DoubleNode<ItemType>* DoublyLinkedList<ItemType>::getAtPos(int position) const
{
    DoubleNode<ItemType>* curPtr = nullptr;

    if (position >= 0) {
        curPtr = headPtr;
        while ((curPtr) && (position > 0)) {
            curPtr = curPtr->getNext();
            --position;
        }
    }

    if (!curPtr)
        return nullptr; // or throw an exception...

    return curPtr;
}
...