std::map Vergleichsoperator



  • Wurde der operator< denn vor dem Benutzen der Map deklariert? Befindet sich die Klasse Segment_3 eventuell in einem Namensraum?



  • Ich habe beide Operatoren global untereinander deklariert:

    bool operator<(const Triangulation& l, const Triangulation& r)
    {
    	return l.number_of_vertices() < r.number_of_vertices();
    } 
    
    bool operator<(const Segment_3& l, const Segment_3& r)
    {
    	return l.vertex(0).x() < r.vertex(0).x();
    }
    

    Bezüglich Namensraum, das stimmt, aber das ist auch bei Triangulation nicht anders und funktioniert trotzdem.

    typedef CGAL::Simple_cartesian<double> SK;
    typedef CGAL::Filtered_kernel<SK> FK;
    struct K : public FK {};
    typedef K::Point_3 Point_3;
    typedef K::Segment_3 Segment_3;
    typedef CGAL::Delaunay_triangulation_3<K> Triangulation;
    


  • Keiner eine Idee? 😕



  • rafilis1982 schrieb:

    Keiner eine Idee? 😕

    Ist der Operator zum Zeitpunkt der Template-Ausprägung auch wirklich bekannt?



  • Ich habe den Operator in der Klasse deklariert die ich includiere.

    Erst dann defniere ich die map. Hab auch schon versucht die Deklaration in der entsprechenden Datei vorzunehmen, wo ich auch die Map definiere, leider ohne Erfolg.



  • Poste vielleicht mal ein Stück Code, du kannst ja das Irrelevante weglassen. Vielleicht hast du irgendwo was übersehen...



  • Building.h:

    #include <QTreeWidget>
    #include <map>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    // -------------------- CGAL
    //#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
    #include <CGAL/Simple_cartesian.h>
    #include <CGAL/Filtered_kernel.h>
    #include <CGAL/Delaunay_triangulation_3.h>
    
    typedef CGAL::Simple_cartesian<double> SK;
    typedef CGAL::Filtered_kernel<SK> FK;
    struct K : public FK {};
    typedef K::Point_3 Point_3;
    typedef K::Segment_3 Segment_3;
    typedef CGAL::Delaunay_triangulation_3<K> Triangulation;
    
    bool operator<(const Segment_3& l, const Segment_3& r)
    {
    	return l.vertex(0) < r.vertex(0);
    }
    bool operator<(const Triangulation& l, const Triangulation& r)
    {
    	return l.number_of_vertices() < r.number_of_vertices();
    } 
    
    class Building
    {...
    }
    

    geomview.cpp

    #include "geomview_mesh.h"
    using namespace citygml;
    
    typedef pair<Segment_3,Edge*> mapEdgePair;
    
    int GeomviewMesh::read(vector<Building*> *f)
    {
    map<Segment_3,Edge*> mapEdge;
    }
    


  • a) sollte man niemals using-Deklarativen im Header benutzen. Das verseucht den globalen Namespace und führt das ganze Namespace-System an sich ad absurdum.
    b) vermisse ich ein #include "Building.h" in geomview.cpp.
    c) solltest Du Dir mal allgemein Gedanken darüber machen, was man den Header (Schnittstelle) packen sollte, und was besser nicht.



  • zu a) und c)
    Niemand ist perfekt 😉

    zu b)
    Das entsprechende include befindet sich in geomview.h



  • rafilis1982 schrieb:

    zu a) und c)
    Niemand ist perfekt 😉

    Trotzdem solltest du Tachyons Tipps zur Kenntnis nehmen.

    Erstell bitte einmal eine Funktion, die ein Segment_3 als Parameter nimmt, deklariere sie am gleichen Ort wie der Operator und rufe sie dort auf, wo der Operator benutzt wird.


Anmelden zum Antworten