2017-02-03 4 views
0

내 논문의 경우 1 년 전에 다른 학생이 작성한 일부 CGAL 코드를 사용하고 있습니다. 그러나 나는 그것을 만들 수 없습니다.CGAL static_cast 실패

에러를주고하면 다음되는 함수 : Curve_handle

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 

사용자 정의 형이 다음 헤더 파일에 정의 된 다음 에러를주는 선 curves.emplace(static_cast<Curve_handle>(curve));

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; 
} 

:

#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 코드베이스에서 원래 학생보다 새로운 버전의 CGAL을 사용하여 저와 관련이 있었으므로 문제가 될 수도 있습니다.하지만 코드 줄을 어떻게 바꾸어야할지 모르겠습니다.

답변

0

:: Originating_curve_iterator 배열은 배열 :: Curve_handle와 다른 구성에 :: Curve_const_handle에 사용자 정의 변환이 있으므로 문

curves.emplace(static_cast<Curve_handle>(curve)); 
문제가 없다

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

컴파일러 그러나

는, 그래서 그냥 (PL_Arrangement :: Curve_const_handle로 정의되는) 'Curve_handle'와 '자동'교체 곡선은 const가 아닌 반복자 있다고 가정합니다.

0

CGAL::Arrangement_on_surface_with_history_2::Originating_curve_iteratorinherits fromI_Dereference_iterator.

Curve_handlePL_Arrangement::Curve_const_handle입니다. 그리고 그것은 CGAL::Arrangement_on_surface_with_history_2::Originating_curve_iterator 또는 I_Dereference_iterator에서 상속되지 않으므로 static_cast 사이의 값은 상속 계층 내에서 아래/위로 캐스트에만 사용할 수 있습니다. static_cast. (또한 배열 :: Originating_curve_handle로서 정의된다)