Можем ли мы вернуть false, когда возвращаемый тип объявлен как ListNode <T>* - PullRequest
0 голосов
/ 04 февраля 2020

Я не программист на C ++, поэтому, учитывая эту функцию (вы можете ее распознать), допустимо ли возвращать false, когда возвращаемый тип объявлен как ListNode *?

Компилятор жалуется, но ищет для решения кажется, что IDE получает вину. Я просто хочу понять, разрешено ли это, и поэтому IDE виновата, или это ошибка.

Если это помогает, это код Arduino, и я использую IDE версии 1.8.11.

template<typename T>
ListNode<T>* LinkedList<T>::getNode(int index) {
  int _pos = 0;
  ListNode<T>* current = root;
  // Check if the node trying to get is
  // immediatly AFTER the previous got one
  if(isCached && lastIndexGot <= index) {
    _pos = lastIndexGot;
    current = lastNodeGot;
  }
  while(_pos < index && current) {
    current = current->next;
    _pos++;
  }
  // Check if the object index got is the same as the required
  if(_pos == index) {
    isCached = true;
    lastIndexGot = index;
    lastNodeGot = current;
    return current;
  }
  return false;
}

отчеты компилятора:

cannot convert bool the ListNode<Device*>*

Вот пример, где эта функция вызывается;

template<typename T>
bool LinkedList<T>::add(int index, T _t) {
  if(index >= _size)
    return add(_t);
  if(index == 0)
    return unshift(_t);
  ListNode<T> *tmp = new ListNode<T>(),
    *_prev = getNode(index-1);
  tmp->data = _t;
  tmp->next = _prev->next;
  _prev->next = tmp;
  _size++;
  isCached = false;
  return true;
}

Опять же, я не программист на С ++ не понимаю этот код. Похоже, что *_prev присваивается результат getNode(index-1), который может быть ложным. Тогда похоже, что он пытается получить доступ _prev->next. Но будет ли _prev ложным или *_prev ложным? Я не понимаю этого.

1 Ответ

2 голосов
/ 04 февраля 2020

Вы действительно не должны return false; там. То, что вы хотите сделать, это return nullptr; или return NULL;, если nullptr недоступно. Причина, по которой это было только предупреждением в прошлом, заключается в том, что вы использовали старый стандарт c ++ в прошлом. В моей системе вы получаете следующее для различных стандартов c ++:

Код:

int* test() {
    return false;
}

int main() {
    test();
}

Вывод:

$ clang++ -std=c++98 test.cpp -Wall -Wextra 
test.cpp:2:12: warning: initialization of pointer of type 'int *' to null from a constant boolean expression [-Wbool-conversion]
    return false;
           ^~~~~
1 warning generated.
$ clang++ -std=c++03 test.cpp -Wall -Wextra 
test.cpp:2:12: warning: initialization of pointer of type 'int *' to null from a constant boolean expression [-Wbool-conversion]
    return false;
           ^~~~~
1 warning generated.
$ clang++ -std=c++11 test.cpp -Wall -Wextra 
test.cpp:2:12: error: cannot initialize return object of type 'int *' with an rvalue of type 'bool'
    return false;
           ^~~~~
1 error generated.

Кажется, в этом есть изменение стандарт C ++ 11. Я не уверен, что именно там изменилось, единственное изменение, которое я знаю из C ++ 11 в отношении преобразований, - это явные операторы, возможно, кто-то еще может что-то сказать по этому поводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...