2016-01-27 15 views
6

Ich arbeite an einem Projekt für meine Schule (ich bin noch ein Anfänger) und ich bin gekommen über das folgende Problem:C++ [Fehler] keine Übereinstimmung für 'operator ==' (Operandentypen sind 'Vehicle' und 'const Vehicle')

"[Error] no match for 'operator==' (operand types are 'Vehicle' and 'const Vehicle')" 

Vehicle eine Klasse in meinem Projekt zu sein.

das ist, was mir den Fehler geben:

int DayLog::findWaitingPosistion(Vehicle const& v){ 
    if (find(waitingList.begin(),waitingList.end(),v) != waitingList.end()) 
     return 1; 
} 

waitingList ist ein Vektor von Vehicle Objekte.

Ich suchte und konnte keine Antwort finden, obwohl es viele ähnliche Fragen zu meinen gab Ich versuchte alles, aber nichts funktionierte. Vielen Dank im Voraus.

+2

Um 'find' zu verwenden, müssen Sie eine' operator == 'Funktion definieren, die' Fahrzeuge' miteinander vergleicht. Dies könnte entweder eine freie Funktion oder eine Elementfunktion sein. [Siehe hier] (http://stackoverflow.com/a/4421719/1505939) zum Beispiel –

+2

Also, Sie brauchen ein 'operator ==' für Ihren Fahrzeugtyp (vorzugsweise nimmt das eine const) –

+1

Sie besser bieten mehr Code wenn Sie wollen eine Antwort –

Antwort

2

Die Mindestanforderungen für die Verwendung finden ist eine angegebene operator== Funktion. Dies verwendet std::find, wenn es den Vektor durchläuft, wenn es Ihren Typ gefunden hat.

So etwas wie dies notwendig sein:

class Vehicle { 
    public: 
    int number; 
    // We need the operator== to compare 2 Vehicle types. 
    bool operator==(const Vehicle &rhs) const { 
     return rhs.number == number; 
    } 
}; 

Diese Sie finden verwenden können. Siehe a live example here.

4

Die Fehlermeldung ist ziemlich klar: Der Compiler sucht nach einer Operator == Funktion, die zwei Fahrzeuge vergleicht. Die Unterzeichnung eines solchen Verfahrens, waren es zu existieren, so etwas wie

bool operator==(const Vehicle& first, const Vehicle& second); 

Was ist nicht so klar sein würde, ist warum dies geschieht. Schließlich verwenden Sie keinen == Operator irgendwo in Ihrem Code! Crummy Compiler - beschweren sich über etwas, was Sie nicht einmal getan haben.

Um zu verstehen, was passiert, müssen Sie die "Finde" -Methode verstehen. Dies ist eine Template-Methode, und in C++ - Vorlagen sind ziemlich fancy-Text suchen und ersetzen (Warnung: massive Vereinfachung!). Der Code für "find" wird für die Typen, die Sie verwenden, direkt vor dem Ausführen des Compilers generiert.

Sie können überprüfen, wie finden Sie implementiert here. Im unwahrscheinlichen Fall, dass jemals geht offline cplusplus.com habe ich den entsprechenden Abschnitt unter * enthalten:

template<class InputIterator, class T> 
    InputIterator find (InputIterator first, InputIterator last, const T& val) 
    { 
     while (first!=last) { 
     if (*first==val) return first; //<--- Notice the == operator 
     ++first; 
     } 
    return last; 
    } 

Das ist, wo die == herkommt! Der Compiler generiert automatisch den Suchcode für den von Ihnen angegebenen Typ (Fahrzeug). Dann, wenn es kompiliert wird, versucht der generierte Code einen Operator == zu verwenden, aber es gibt keinen für das Fahrzeug. Sie müssen einen mit Ihrer Fahrzeugklasse angeben.

* Ernsthaft aber - check out that website. Es zeigt dir, wie all das funktioniert.

Verwandte Themen