problem mit auto statement



  • hi,

    ich habe eine frage zu auto...wie kann ich den compiler error fixen ohne auf das auto zu verzichten?

    template <class T>
    auto Tree<T>::get_parent(Tree<T>::Node *curr, Tree<T>::Node *to_find) {
      if(!curr) {
        return NULL;
      }
    
      if(to_find == root) {
        return NULL;
      }
      else if(curr->left == to_find || curr->right == to_find) {
        return curr;
      }
    
      return get_parent(curr->left, to_find);
      return get_parent(curr->right, to_find);
    }
    
    g++-4.9 -std=c++14 -o delete_node delete_node.cpp; ./delete_node
    delete_node.cpp: In instantiation of 'auto Tree<T>::get_parent(Tree<T>::Node*, Tree<T>::Node*) [with T = int]':
    delete_node.cpp:63:50:   required from 'void Tree<T>::delete_node(Tree<T>::Node*) [with T = int]'
    delete_node.cpp:107:29:   required from here
    delete_node.cpp:13:12: warning: converting to non-pointer type 'long int' from NULL [-Wconversion-null]
         return NULL;
                ^
    delete_node.cpp:17:12: warning: converting to non-pointer type 'long int' from NULL [-Wconversion-null]
         return NULL;
                ^
    delete_node.cpp:20:12: error: inconsistent deduction for 'auto': 'long int' and then 'Tree<int>::Node*'
         return curr;
                ^
    delete_node.cpp:20: confused by earlier errors, bailing out
    


  • Caste NULL zu Tree<T>::Node *.

    Ich verstehe den Drang nicht automatic return type deduction für solche Funktionen zu verwenden.
    Das macht den Code nur unleserlicher und bringt keinen Mehrwert. Aber jeder, der die Funktion verwenden will, muss in die Implementierung schauen, um zu sehen, was sie zurückgibt. Und das ist einfach nur Mist.



  • Nathan schrieb:

    Caste NULL zu Tree<T>::Node *.

    Für sowas wurde 'nullptr' eingeführt



  • NULL? nullptr!



  • das soll nullptr sein...

    soll ich dafuer folgendes nehmen?

    typename Tree<T>::Node* Tree<T>::get_parent(Tree<T>::Node *curr, Tree<T>::Node *to_find)
    


  • tkausl schrieb:

    Nathan schrieb:

    Caste NULL zu Tree<T>::Node *.

    Für sowas wurde 'nullptr' eingeführt

    manni66 schrieb:

    NULL? nullptr!

    Macht in dieser Hinischt keinen Unterschied oder GCC verhält sich nicht standardkonform.


  • Mod

    Nathan schrieb:

    Macht in dieser Hinischt keinen Unterschied

    Das ist kein Argument wenn es um Konsistenz und Idiomatik geht.

    Übrigens würde vielleicht

    auto Tree<T>::get_parent(Tree<T>::Node *curr, Tree<T>::Node *to_find)
      -> Tree<T>::Node*
    

    noch lesbarer sein.



  • @Arcoth: du hast das typename vergessen:

    typename Tree<T>::Node* Tree<T>::get_parent(Tree<T>::Node *curr, Tree<T>::Node *to_find)
    

Anmelden zum Antworten