Probleme bei Operator-Überladung von <
-
Da der Code noch sehr kurz ist werde ich ihn mal ganz posten (ist natürlich noch nicht fertig und ich noch nicht wirklich alles sorgfältig überdacht. Ist mehr um ein bisschen zu testen gedacht):
//HuffmanCode.h #ifndef HUFF_44_MAN_CODE #define HUFF_44_MAN_CODE #include <iostream> #include <vector> #include <string> namespace { struct Node { Node* left; Node* right; std::string symbol; Node( std::string & a_symbol, Node* a_left = 0, Node* a_right = 0 ) : left(a_left), right(a_right), symbol(a_symbol) {} bool operator< ( const Node & lhs ) const { return false; } }; } namespace ica { struct Letter { char letter; int frequency; }; class HuffmanCode { private: std::vector<Letter> symbols; Node* root; public: // Ctor HuffmanCode( std::vector<Letter> & a_symbols ); //std::string encode( const std::string & s ); //std::string decode( const std::string & s ); }; } #endifUnd das Implementierungsfile:
#include "HuffmanCode.h" #include <algorithm> namespace ica { HuffmanCode::HuffmanCode( std::vector<Letter> & a_symbols ) : symbols(a_symbols), root(0) { std::sort( symbols.begin(), symbols.end() ); // Hier liegt das Problem und ist auch der Grund, warum ich den '<' Operator überladen muss. } }
-
namespace { struct Node { Node* left; Node* right; std::string symbol; Node( std::string & a_symbol, Node* a_left = 0, Node* a_right = 0 ) : left(a_left), right(a_right), symbol(a_symbol) {} }; bool operator< ( const Node & lhs, const Node& rhs) const { return false; } }std::sort braucht die 2 wertige Variante.
-
Oder alternativ einen less-Funktor, den es bereits gibt. Dann sollte es auch mit der anderen Variante gehen.
-
@drakon
Danke. Ich habs jetzt gemacht, aber etwas scheint noch immer nicht ganz zu stimmen. Ich werds mir dann morgen nochmals genauer anschauen.@ /rant/
Meinst du einen einen Zeiger auf eine Funktion, die den Vergleich macht, als dritten Parameter zu übergeben?
-
Das liegt dann wahrscheinlich wo anders.

Er meint damit ein Funktionsobjekt.
-
drakon schrieb:
std::sort braucht die 2 wertige Variante.
Nein, sort() ist es egal, wie der Vergleichsoperator definiert ist, solange es dort die sortierten Objekte darin übergeben kann.
Und genau da liegt das Problem - du benötigst einen Vergleichs-Operator für ica::Letter - oder eventuell eine Typumwandlung von ica::Letter nach Node (so daß dein operator anwendbar wird).
-
@ Drakon
Achso, hatte den Begriff Funktor vergessen. Funktionsobjekt ist klar
@ CStoll
Ich könnte mich gerade Ohrfeigen.
Wenn ich einen vector<Letter> sortieren will, dann sollte ich den '<'-Operator auch in Letter und nicht in Node überladen
Ich habe den Operator jetzt in Letter überladen und alles funktioniert.Naja, ich habe sehr wenig geschlafen diese Woche ^^
Danke für eure Hilfe.
-
CStoll schrieb:
drakon schrieb:
std::sort braucht die 2 wertige Variante.
Nein, sort() ist es egal, wie der Vergleichsoperator definiert ist, solange es dort die sortierten Objekte darin übergeben kann.
Stimmt. Hab nur zur Sicherheit mal kurz hier geschaut und nur auf das comp Argument geschaut..
Ich geh auch besser schlafen. ^^
-
Wieso schreiben alle C++ in eine .h-Datei?

-
EOutOfResources schrieb:
Wieso schreiben alle C++ in eine .h-Datei?

Gewohnheit
