Operator < überladen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
dusti
Beiträge: 35
Registriert: 7. März 2009 14:24

Operator < überladen

Beitrag von dusti »

Ich habe folgenden Code (aufs Wesentliche gekürzt):
Header der Klasse programmVersion:

Code: Alles auswählen

bool operator < (programmVersion versionItem);
Code in der Klasse:

Code: Alles auswählen

bool programmVersion::operator< (programmVersion versionItem)
{
    return true; //Nur zum Testen :)
}
Ich programmiere mit dm Qt Creator. Dabei bekomme ich den Fehler:
updater.cpp:20: error: no match for 'operator<' in 'versionItem < actualVersion'
programmversion.h:13: note: candidates are: bool programmVersion::operator<(programmVersion)
Hervorgerufen wird der Fehler durch die Zeile:

Code: Alles auswählen

 if (version1 < version1)
Ich habe jetzt schon einige zeit mit Google gesucht und mich durch verschiedene Anleitungen durchgelesen, komme aber trotzdem nicht auf die Lösung. Es wäre sehr nett, wenn mir jemand sagen könnte, was ich falsch mache und wie ich den Fehler beheben kann.

Danke, dusti
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

updater.cpp:20: error: no match for 'operator<' in 'versionItem < actualVersion'
da steht aber 'versionItem < actualVersion' und nicht 'version1 < version1' ... ist evt. "actualVersion" oder "versionItem" ein Pointer? Falls ja: Dereferenzieren..
dusti
Beiträge: 35
Registriert: 7. März 2009 14:24

Beitrag von dusti »

@solarix: Entschuldigung, das ist ein Fehler meinerseits. Ich hatte die Variablennamen geändert, damit keine Verwirrung entsteht, da ich sowohl innerhalb als auch ausserhalb der Klasse gleichnamige Variablen hatte. Die beiden sind keine Pointer.
@franzf: Leider hilft mir das nicht weiter. In dem von dir verlinkten Text sieht die Definition so aus:

Code: Alles auswählen

bool operator<(X const& lhs, X const& rhs);
Bei mir kommt dann allerdings der Fehler:
programmversion.h:13: error: `bool programmVersion::operator<(const programmVersion&, const programmVersion&)' must take exactly one argument
Oder habe ich da etwas übersehen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

dusti hat geschrieben:

Code: Alles auswählen

bool operator<(X const& lhs, X const& rhs);
Bei mir kommt dann allerdings der Fehler:
programmversion.h:13: error: `bool programmVersion::operator<(const programmVersion&, const programmVersion&)' must take exactly one argument
Oder habe ich da etwas übersehen?
Du hast übersehen, dass man Operatoren sowohl als Memberfunktionen als auch als freie FUnktionen implementieren kann. Du nimst jetzt die Signatur der freien Funktion (2 Parameter vom Typ cont T&) und implementierst das als Memberfunbktion. Kann ja nur schief gehen ;)

Für alles, was nicht eine Referenz auf this zurückgibt (operator += z.B.), nimmt man bevorzugt die freie Funktion. Eine Memberfunktion bindet stärker an ein Objekt, und bei z.B. Vergleichen sind beide Objekte gleichwertig.

Code: Alles auswählen

a.operator<(b); // starke Bindung an "a" bei Memberfunktion
operator<(a, b); // beide gleichwertig bei freier Funktion
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn die Funktion innerhalb der Klasse ist heißt es natürlich operator <(X const &o) const;
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dusti
Beiträge: 35
Registriert: 7. März 2009 14:24

Beitrag von dusti »

@Christian81: Leider hilft das auch nicht weiter, die Fehlermeldungen kommen immer noch, dass keine Übereinstimmung für operator< gefunden werden konnte.

@franzf: ich verstehe leider nicht ganz, was du mit
Du nimmst jetzt die Signatur der freien Funktion (2 Parameter vom Typ const T&) und implementierst das als Memberfunktion.
meinst. Wie genau soll ich eine freie Funktion als Memberfunktion implementieren? Ist das nicht genau das gleiche, wie ich es oben schon gemacht habe, als dann der Fehler kam, dass genau ein Argument erwartet würde?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

OK, es gibt 2 Möglichkeiten:
Memberfunktion:

Code: Alles auswählen

class T
{
public:
    bool operator<(const T& other) const;
};
Dann das gleiche als freie FUnktion:

Code: Alles auswählen

class T
{
};
bool operator<( const T& left, const T& right );
Beides Möglichkeiten die funktionieren.

Und jetzt nimmst du die Signatur der freien FUnktion und packst das in die Klasse:

Code: Alles auswählen

class T
{
public:
    bool operator<( const T& left, const T& right ) const;
}
Und DAS funktioniert NICHT!! Aber genau so hast du das jetzt gemacht. Also ausbessern. Nimm eine von den beiden oberen Varianten, am besten gleich die freie Funktion.
Hoffe das war jetzt klar :)

// edit
Aber eigentlich steht das alles sooo schön erklärt in dem von mir geposteten Artikel :(
Lies ihn einfach nochmal aufmerksam durch, auf die Gefahr hin etwas mehr zu lernen als für den aktuellen Fall nötig wäre.
dusti
Beiträge: 35
Registriert: 7. März 2009 14:24

Beitrag von dusti »

Aber wenn ich die freie Funktion in die Klasse packe, kommt doch der Fehler:
programmversion.h:14: error: `bool programmVersion::operator<(const programmVersion&, const programmVersion&)' must take exactly one argument
Meine Signatur sieht so aus:

Code: Alles auswählen

bool operator< (const programmVersion& lhs, const programmVersion& rhs) const;
Oder habe ich dich jetzt falsch verstanden? Den das habe ich ja schon ausprobiert, wie ich oben geschrieben habe.
Edit: hm, genau das hast du ja geschrieben, dass das nicht funktioniert. Sorry, da hab ich zu schnell geantwortet.
Edit2: Als Memberfunktion mit der Signatur:

Code: Alles auswählen

bool operator< (const programmVersion& rhs) const;
kommt immer noch der Fehler:
updater.cpp:20: error: no match for 'operator<' in 'versionItem < actualVersion'
Schreibe ich den Operator als freie Funktion:

Code: Alles auswählen

class programmversion {...};
bool operator < (programmVersion const& lhs, programmVersion const& rhs) const;
kommt der Fehler:
programmversion.h:27: error: non-member function `bool operator<(const programmVersion&, const programmVersion&)' cannot have `const' method qualifier
lösche ich das const kommt der Fehler:
updater.cpp:20: error: no match for 'operator<' in 'versionItem < actualVersion'
Also egal was ich mache, es kommt immer ein Fehler.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Bitte poste dann mal den Codeabschnitt, der zu dem Fehler führt. Das hast du nämlich bisher noch gar nicht getan.
Und zawr samt den Stellen, in denen "versionItem" und "actualVersion" deklariert werden. Ich will die Typen wissen! Ich denke nämlich da steckt das Problem...
dusti
Beiträge: 35
Registriert: 7. März 2009 14:24

Beitrag von dusti »

Du hast recht, das Problem war, dass eine der zwei Variablen wirklich ein Zeiger war. Sorry für all den Trouble den ich verursacht habe und danke vielmals für die viele Hilfe!
Antworten