2017-09-26 3 views
0

Ich versuche, verknüpfte Liste Klasse zu erstellen und die Iteratoren zu definieren, ich habe alle von ihnen mit Ausnahme der letzten. Ich erhalte nicht, wie sie zu beheben, ich diese Fehlermeldung erhalten, wenn ich meinen Code zu kompilieren: 'operator ='!keine Übereinstimmung für Operator! =

kein Spiel für in ‚recList.SortedList :: beginnt mit T = Aufnahme = recList.SortedList :: Ende mit T = Record ' a1q1main.cpp: 114: 37: Hinweis: Kandidaten sind: Sortedlist.h: 112: 11: Hinweis: SortedList :: Iterator SortedList :: Iterator :: Operator! = (Bool) [mit T = Record, SortedList :: iterator = SortedList :: iterator] sortedlist.h: 112: 11: Anmerkung: es gibt keine Konvertierung für Argument 1 von 'SortedList :: Iterator' auf 'Bool'

Es hält an Anzeige dieses Fehlers, egal was ich mache Ich habe erklärt Operator == und alles ist in Ordnung, aber die = klagt Hier ist der Code:

class SortedList { 
struct Node { 
    T data_; 
    Node* next_; 
    Node* prev_; 
    Node(const T& data = T{}, Node* next = nullptr, Node* prev = nullptr) { 
     data_ = data; 
     next_ = next; 
     prev_ = prev; 
    } 
}; 
Node* head_; 
Node* tail_; 
    public: 
class const_iterator { 
protected: 
    Node* curr_; 
public: 
    const_iterator(Node* p) { 
     curr_ = p; 
    } 
......... 
    const_iterator operator--(int) { 
     const_iterator tmp = *this; 
     curr_ = curr_->prev_; 
     return tmp; 
    } 
    const T& operator*() const { 
     return curr_->data_; 
    } 


    const_iterator operator==(bool){ 
      return false; 
    } 

    const_iterator operator!=(bool){ 
      return true; 
    } 

return;` 

Ich brauche die unten aufgeführten Kriterien erfüllen: operator = gibt true zurück, wenn zwei Iteratoren an anderer Stelle Knoten, ansonsten false O (1)

ich die Logik des Betreibers nicht abgeschlossen haben, ich brauche nur das ich bekomme nicht den Fehler richtig zu erklären, so

+1

'operator! =' (In den meisten Fällen) nimmt einen anderen Iterator und gibt einen Bool zurück, überprüfen Sie Ihre Signatur – YiFei

+1

Signatur sollte wie ['Bool Operator! = (L, R);'] (http: // en. cppreference.com/w/cpp/language/operator_comparison). Als eigenständige Freundesfunktion. Oder wahrscheinlich 'bool operator! = (OTHER)' als Mitglied. Sie haben sie so definiert, dass sie ein bool-Argument verwenden und einen Iterator zurückgeben. –

+0

vor allem, wenn ich zwei Parameter zu der Funktion hinzufügen beschwert und sagt, ich muss nur einen Parameter übergeben, zweitens Bool Operator! =() Ändert sich nicht die Situation und der gleiche Fehler erscheint – Oleh

Antwort

1

die Unterschrift des Betreibers Überlastungen sind nicht korrekt. Sie lassen sie einen Bool akzeptieren und einen Iterator zurückgeben. Es sollte umgekehrt sein.

Betrachten wir die Operation Sie einen Iterator als Rückgabewert

if(it1 == it2){ 
    // do stuff 
} 

Sie kehren sogar einen Bool in Ihre Funktionen trotz der Signatur durchführen müssen.

Statt die Betreiber Überlastungen in der erforderlichen Unterschrift implementieren

bool operator==(sorted_list_iterator it){ 
    return (curr_->data_ == it.curr_->data_); 
} 

bool operator!=(sorted_list_iterator it){ 
    return !(*this == it); 
} 

Hinweis können Sie Ihre operator== Überlastung in Ihrem operator!= verwenden zu vermeiden, in zwei Funktionen, die Gleichheit Logik wiederholen. Möglicherweise müssen Sie in diesen Funktionen auch eine Null curr_ zulassen.

+0

danke, ich habe es fixed only – Oleh

+0

cool gut, wenn diese Antwort nützlich ist, fühlen Sie sich frei zu upvote und markieren Sie als akzeptiert, so dass jeder mit dem gleichen Problem in der Zukunft kann zuversichtlich sein, diese Antwort zu verwenden. –

Verwandte Themen