Я получаю пустое значение, которое не игнорируется, так как это должно быть ошибкой, почему? - PullRequest
1 голос
/ 27 октября 2019

Функция поворота недействительна с аргументом 1 int. Я не знаю, почему я получаю эту ошибку. Это только пустая функция с двумя операторами.

head_ptr_ - это переменная закрытого связанного списка.

getNodeAt возвращает узел в заданной позиции "position". Так как он возвращает узел, мы можем получить доступ к его членам, назначение работает справа налево. Это завершает все на правой стороне операнда перед назначением. Если я ошибаюсь, не стесняйтесь исправить мои знания.

template <class T>
void LinkedList<T>::rotate(int k)
{
    head_ptr_ = getNodeAt(k)->setNext(head_ptr_);//error here
    head_ptr_ = getNodeAt(k-1)->setNext(nullptr);
}//end of rotate

template<class T>
Node<T>* LinkedList<T>::getNodeAt(int position) const
{
    // Count from the beginning of the chain
    Node<T>* cur_ptr = head_ptr_;
    for (int skip = 0; skip < position; skip++)
        cur_ptr = cur_ptr->getNext();

    return cur_ptr;
}  // end getNodeAt

int main()
{
    LinkedList<int> bag1;

    for(int i = 14;i >= 10;i--)
    {
        bag1.insert(bag1.getLength(),i);
    }
    bag1.print();
    cout << endl;
    //bag1.invert();
    bag1.rotate(3);
    bag1.print();

    system("PAUSE");
    return 0;
}

ошибка: пустое значение не игнорируется, так как должно быть

1 Ответ

0 голосов
/ 27 октября 2019

Анализ ошибки:

ошибка: пустое значение не игнорируется, как и должно быть.

Это сообщение об ошибке GCC, которое означает возвращаемое значениефункция 'void', но вы пытаетесь присвоить ее непустой переменной.

Ваш конкретный случай: Ваш setNext () , скорее всего, возвращает void, и вы пытаетесь сохранить его возвращаемый результат в переменной, поэтому вы получаете ошибку, которую вы упомянули в этих двух строках кода, которые вы разместили в своей функции rotate:

head_ptr_ = getNodeAt(k)->setNext(head_ptr_);//error here
head_ptr_ = getNodeAt(k-1)->setNext(nullptr);

Вы можете решить проблему двумя способами: 1-е решение: Измените свой код, чтобы он был таким, и примените необходимые изменения, чтобы сохранить ту же логику:

getNodeAt(k)->setNext(head_ptr_);
getNodeAt(k-1)->setNext(nullptr);

2-е решение: Измените функцию setNext () , чтобы она возвращала действительный указатель (не забудьте также изменить объявление метода, чтобы оно возвращало указатель Node ):

template<class T>
Node<T>* LinkedList<T>::setNext(Node<T>* next)
{
    // same logic here as before
    return ptr; // where ptr is a valid pointer that you want to return
}  
...