2017-02-03 5 views
0

Pour ma thèse, j'utilise du code CGAL écrit par un autre étudiant il y a un an. Je ne peux pas l'obtenir pour construire, cependant.CGAL static_cast échoue

La fonction qui donne erreurs est la suivante:

std::set<Curve_handle> originatingCurves(PL_Arrangement arrangement, VertexHandleSet vertices) 
{ 
    std::set<Curve_handle> curves; 
    for (Vertex_handle vertex : vertices) 
    { 
    auto heStart = vertex->incident_halfedges(); 
    auto heCurrent = vertex->incident_halfedges(); 
    do 
    { 
     Halfedge_handle handle = static_cast<Halfedge_handle>(heCurrent); 
     //Unless the halfedge represents a piece of overlap between curves, it has only one originating curve 
     for (auto curve = arrangement.originating_curves_begin(handle); curve != arrangement.originating_curves_end(handle); curve++) 
     { 
     curves.emplace(static_cast<Curve_handle>(curve)); 
     } 
     heCurrent++; 
    } while (heCurrent != heStart); 
    } 
    return curves; 
} 

avec la ligne curves.emplace(static_cast<Curve_handle>(curve)); donnant les erreurs suivantes:

Severity Code Description Project File Line Suppression State 
Error C2672 'std::_Tree<std::_Tset_traits<_Kty,_Pr,_Alloc,false>>::emplace': no matching overloaded function found CurvedNonograms c:\users\demeessias\documents\1. studie\0.masterthesis\curvednonograms-code\curvednonograms\curvednonograms\curve_manipulation.cpp 222 
Error C2440 'static_cast': cannot convert from 'CGAL::Arrangement_on_surface_with_history_2<GeomTraits_,CGAL::Arr_bounded_planar_topology_traits_2<GeomTraits_,Dcel>>::Originating_curve_iterator' to 'Curve_handle' CurvedNonograms c:\users\demeessias\documents\1. studie\0.masterthesis\curvednonograms-code\curvednonograms\curvednonograms\curve_manipulation.cpp 222 

Les types définis par l'utilisateur comme Curve_handle sont définis dans le fichier d'en-tête suivant :

#pragma once 

#include <CGAL/Cartesian.h> 
#include <CGAL/CORE_algebraic_number_traits.h> 
#include <CGAL/Arr_Bezier_curve_traits_2.h> 
#include <CGAL/Arrangement_2.h> 
#include <CGAL/Arrangement_with_history_2.h> 
#include <CGAL/Arr_extended_dcel.h> 
#include <CGAL/Iso_rectangle_2.h> 
#include <CGAL/Arr_walk_along_line_point_location.h> 
#include <CGAL/Arr_observer.h> 
//#include <CGAL/basic.h> 

#include <CGAL/Exact_predicates_exact_constructions_kernel.h> 
#include <CGAL/Arr_segment_traits_2.h> 
#include <CGAL/Arr_polyline_traits_2.h> 

struct FaceData 
{ 
    FaceData() 
    { 
    colored = false; 
    solved = false; 
    }; 
    bool colored = false; 
    bool solved = false; 
}; 

//// Bezier curve traits //// 

typedef CGAL::CORE_algebraic_number_traits Nt_traits; 
typedef Nt_traits::Rational NT; 
typedef Nt_traits::Rational Rational; 
typedef Nt_traits::Algebraic Algebraic; 
//Simple_cartesian = for easier debugging, no ref counting, values directly in objects 
typedef CGAL::Cartesian<Rational> Kernel; 
typedef CGAL::Cartesian<Algebraic> Alg_kernel; 
//typedef Kernel::Point_2 Rat_Point; 
typedef CGAL::Arr_Bezier_curve_traits_2<Kernel, Alg_kernel, Nt_traits> Traits; 

typedef Traits::Curve_2 Bezier; 
typedef Traits::Point_2 Point; 
typedef Kernel::Iso_rectangle_2 BoundingBox; 

typedef CGAL::Arr_face_extended_dcel<Traits, FaceData> Dcel; 
typedef CGAL::Arrangement_with_history_2<Traits, Dcel> Arrangement; //Not really used anymore, because of crashes/problems/bugs 



//// Polyline traits //// 

// Instantiate the traits class using a user-defined kernel 
// and Segment_traits_2. 
typedef CGAL::Exact_predicates_exact_constructions_kernel PL_Kernel; 
typedef CGAL::Arr_segment_traits_2<PL_Kernel>    Segment_traits; 
typedef CGAL::Arr_polyline_traits_2<Segment_traits>  PL_traits; 
// Identical instantiation can be achieved using the default Kernel: 
// typedef CGAL::Arr_polyline_traits_2<>     Geom_traits_2; 
typedef PL_traits::Point_2       PL_Point; 
typedef PL_traits::Segment_2       Segment; 
typedef PL_traits::Curve_2       Polyline; 

typedef CGAL::Arr_extended_dcel<PL_traits, bool/*not used*/, double, FaceData> PL_Dcel; 
typedef CGAL::Arrangement_with_history_2<PL_traits, PL_Dcel> PL_Arrangement; //This is now the only type of arrangement that we actually use 
//Handles 
typedef PL_Arrangement::Vertex_const_handle   Vertex_handle; 
typedef PL_Arrangement::Halfedge_const_handle  Halfedge_handle; 
typedef PL_Arrangement::Curve_const_handle   Curve_handle; 

//Point location 
typedef CGAL::Arr_walk_along_line_point_location<PL_Arrangement> PointLocationAlg; 
typedef CGAL::Arr_point_location_result<PL_Arrangement>::Type PointLocationResult; 


//Less function to use for (vertex/halfedge/face) handle sets 
template <class Handle> struct HandleLess 
{ 
    bool operator()(Handle a, Handle b) 
    { 
    return (a.ptr() - b.ptr() < 0); 
    } 
}; 
typedef std::set<Vertex_handle, HandleLess<Vertex_handle>> VertexHandleSet; 


//Arrangement observer that keeps the face colours correct 
class FaceColorObserver : public CGAL::Arr_observer<PL_Arrangement> 
{ 
private: 
    bool coloredBeforeMerge; 
public: 
    FaceColorObserver(PL_Arrangement& arrangement) : 
    CGAL::Arr_observer<PL_Arrangement>(arrangement) 
    {} 

    virtual void after_split_face(Face_handle oldFace, Face_handle newFace, bool) 
    { 
    newFace->data().colored = oldFace->data().colored; 
    } 

    virtual void before_merge_face(Face_handle face1, Face_handle face2, Halfedge_handle) 
    { 
    //The assumption is that only same-color faces get merged 
    CGAL_precondition(face1->data().colored == face2->data().colored); 
    coloredBeforeMerge = face1->data().colored;// && face2->data().colored; 
    } 
    virtual void after_merge_face(Face_handle newFace) 
    { 
    newFace->data().colored = coloredBeforeMerge; 
    } 
}; 

//Arrangement of line segments 
typedef CGAL::Arrangement_2<Segment_traits> Seg_Arrangement; 

Previous problems J'avais avec le code de base à faire avec moi en utilisant une nouvelle version de CGAL que l'étudiant original, donc je soupçonne que cela pourrait être le problème ici aussi, mais je ne sais pas comment je devrais remplacer la ligne de code.

Répondre

0

Arrangement :: Originating_curve_iterator (qui est également définie comme arrangement :: Originating_curve_handle) a une conversion définie par l'utilisateur à un arrangement :: Curve_handle et un autre arrangement à :: Curve_const_handle, donc il n'y a pas de problème avec la déclaration

curves.emplace(static_cast<Curve_handle>(curve)); 

Cependant, dans

for (auto curve = arrangement.originating_curves_begin(handle); 
    curve != arrangement.originating_curves_end(handle); curve++) 

le compilateur suppose que la courbe est un itérateur non-const, alors il suffit de remplacer 'auto' par 'Curve_handle' (qui est défini comme PL_Arrangement :: Curve_const_handle).

0

CGAL::Arrangement_on_surface_with_history_2::Originating_curve_iteratorinherits fromI_Dereference_iterator.

Un Curve_handle est un: PL_Arrangement::Curve_const_handle. Et puisque cela n'hérite pas de CGAL::Arrangement_on_surface_with_history_2::Originating_curve_iterator ou de I_Dereference_iterator vous ne pouvez pas static_cast entre les 2. static_cast ne peut être utilisé que pour les distributions descendantes/ascendantes dans une hiérarchie d'héritage.