Globales Sortieren, Definition Bool Operator



  • Hi,
    ich möchte in 2 verschiedenen Funktionen, bzw. in zwei verschiedenen .cpp's einen Vektor sortieren lassen.

    Dafür füge ich in die xyz.cpp folgendes ein:

    bool operator <(const one_feature& left, const one_feature& right)
    {
      if  (left.value > right.value) return true;
      return false;
    }
    

    und benutze dann anschließend:

    sort ( iXYFeatSymm->xy_list.begin(), iXYFeatSymm->xy_list.end() );
    

    es funktioniert wunderbar.

    Jetzt ist eine neue Funktion dazugekommen, abc.cpp

    Wenn ich nun wieder folgendes einfüge:

    bool operator <(const one_feature& left, const one_feature& right)
    {
      if  (left.value > right.value) return true;
      return false;
    }
    

    um auch hier einen Vektor mit sort.... zu sortieren. Erhalte ich eine Fehlermeldung beim Kompilieren:

    1>LINK : c:\test\\SYMMBApplication.exe not found or not built by the last incremental link; performing full link
    1>abc.obj : error LNK2005: "bool __cdecl operator<(struct one_feature const &,struct one_feature const &)" (??M@YA_NABUone_feature@@0@Z) already defined in xyz.obj
    1>c:\test\\SYMMApplication.exe : fatal error LNK1169: one or more multiply defined symbols found
    

    Sortieren klappt "alleine" jeweils in beiden. Nur nicht in beiden gleichzeitig.

    Ich vermute dass ich:

    bool operator <(const one_feature& left, const one_feature& right)
    {
      if  (left.value > right.value) return true;
      return false;
    }
    

    irgendwie global definieren muss, um in beiden Fkt. zu sortieren?



  • froob schrieb:

    Ich vermute dass ich:

    bool operator <(const one_feature& left, const one_feature& right)
    {
      if  (left.value > right.value) return true;
      return false;
    }
    

    irgendwie global definieren muss, um in beiden Fkt. zu sortieren?

    Nein, du musst (besser gesagt: darfst) den Operator nur genau einmal definieren. D.h. du darfst nciht in zwei oder mehr Übersetzungseinheiten die selbe Funktion definieren. Du darfst sie allerdings mehrfa deklarieren, dazu sind header da.

    Zum Unterschied Definition/Deklaration siehe FAQ, und schau dir am Besten mal im Buch deiner Wahl den Abschnitt zum Thema "mehrere Übersetzungseinheiten" an (oder "Aufteilung von Sourcecode" oder soetwas).



  • Ok. habe mich mal schlau gelesen und folgendes durchgeführt:

    bool operator < (const one_feature& left, const one_feature& right);

    in die entsprechende .h eingefügt, nun erhalte ich keine Fehlermeldung mehr und in beiden Fkt. wird wunderbar sortiert.

    Vielen Dank!!

    PS: Ich sitze schon seit 2 Stunden an dem Problem und habe schon zig Sachen probiert, aber bin nicht auf deine Idee gekommen.



  • Man kann auch einfach unterschiedliche Vergleichsfunktionen definieren und sie der sort-Funktion als Parameter mitgeben.



  • BTW, dein Operator sagt folgendes: "Wenn left.value größer ist als right.value, dann ist left kleiner als right." Das ist bestenfalls unintuitiv und wird die Anwender (und dich später auch) nur verwirren...


Anmelden zum Antworten