CGAL doesn't recognize type

淺唱寂寞╮ 提交于 2019-12-25 09:26:10

问题


For my thesis project I am dependent on a bunch of CGAL code written by another student a year ago. Unfortunately, I can't get the code to compile due to errors. These errors were probably not experienced by the previous student, so they probably are more related to my setup than the code itself, but I have no idea what the direct cause is.

The errors are in the file CCBSegmentCalculator.h. The code is as follows:

#pragma once
#include "bezier_arrangement.h"

//Circulates around a PL_Arrrangement CCB, visiting the points between the segments that make up the CCB
//  (so smaller-scale than the build-in iterator that only visits the PL_Arrangement vertices)

// --- Could be used in more places than it is now, e.g., in the SVGHandler
class CCBSegmentCirculator
{
public:
  CCBSegmentCirculator(PL_Arrangement::Ccb_halfedge_const_circulator ccbCirculator);

  const CCBSegmentCirculator& next();
  PL_Point operator*();
  PL_Point get(); // same as operator*
  bool operator==(const CCBSegmentCirculator &other) const;

private:


  const PL_Arrangement::Ccb_halfedge_const_circulator halfedgesBegin;
  PL_Arrangement::Ccb_halfedge_const_circulator halfedge;
  //Depending on this boolean ...
  bool forward;
  //... we are either using these forward iterators ...
  // -> in which case the 'current' point is segment.source

  Polyline::Segment_const_iterator segment;
  Polyline::Segment_const_iterator segmentEnd;
  //... or these reverse iterators
  // -> in which case the 'current' point is segmentReverse.target
  Polyline::Segment_const_reverse_iterator segmentReverse;
  Polyline::Segment_const_reverse_iterator segmentReverseEnd;

  void initHalfedge();
};

The file "bezier_arrangement.h" has the following code:

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

The errors I am getting have to do with the fact that CGAL either thinks the defined Polyline type doesn't have a member Segment_const_iterator, or it fails to properly recognize the type at all. I'm not sure, due to it being translated into an internal CGAL type. The errors I get are:

Error   C2039   'Segment_const_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>'  CurvedNonograms c:\users\demeessias\documents\1. studie\0.masterthesis\curvednonograms-code\curvednonograms\curvednonograms\ccbsegmentcirculator.h  39

repeated for the lines containing the definitions of segment,segmentEnd,segmentReverse,and segmentReverseEnd.

According to the documentation, Curve_2 should have a definition for Segment_const_iterator.

Once again, the error is probably not in the code itself, but in my build/linking of CGAL somewhere. Reinstalling CGAL did not help, and I'm pretty sure I have it linked in the relevant places, but this part of building software isn't really my strong suit so I may not know all the relevant spots.

edit: the very first error given in the output is:

c:\users\demeessias\documents\1. studie\0.masterthesis\curvednonograms-code\curvednonograms\c‌​urvednonograms\svgha‌​ndler.cpp(94): error C2039: 'begin_segments': is not a member of 'CGAL::_Curve_data_ex<CGAL::internal::X_monotone_polycurve_2‌​<CGAL::Arr_segment_2‌​<Kernel_>,CGAL::Poin‌​t_2<Kernel_>>,CGAL::‌​_Unique_list<Data_>>‌​' 2> with 2> [ 2> Kernel_=PL_Kernel, 2> Data_=CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<PL_Ker‌​nel>,CGAL::Point_2<C‌​GAL::Epeck>> * 2> ]

This is in a different code file than the one shown above, as there are more errors in the code, but all of them seem to stem from similar problems. there are also some warnings of the form:

2>c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility(313): warning C4503: '__LINE__Var': decorated name length exceeded, name was truncated

Adding the CCBSegmentCalculator.h to a different project to compile only it gives the following errors:

Severity    Code    Description Project File    Line    Suppression State
Error (active)      class "CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<CGAL::Exact_predicates_exact_constructions_kernel>, CGAL::Point_2<CGAL::Epeck>>" has no member "Segment_const_iterator"  CurvedNonogramsGenerator    c:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\Code\CurvedNonogramsGenerator\CurvedNonogramsGenerator\CCBSegmentCirculator.h    28  
Error (active)      class "CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<CGAL::Exact_predicates_exact_constructions_kernel>, CGAL::Point_2<CGAL::Epeck>>" has no member "Segment_const_iterator"  CurvedNonogramsGenerator    c:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\Code\CurvedNonogramsGenerator\CurvedNonogramsGenerator\CCBSegmentCirculator.h    29  
Error (active)      class "CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<CGAL::Exact_predicates_exact_constructions_kernel>, CGAL::Point_2<CGAL::Epeck>>" has no member "Segment_const_reverse_iterator"  CurvedNonogramsGenerator    c:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\Code\CurvedNonogramsGenerator\CurvedNonogramsGenerator\CCBSegmentCirculator.h    32  
Error (active)      class "CGAL::internal::Polycurve_2<CGAL::Arr_segment_2<CGAL::Exact_predicates_exact_constructions_kernel>, CGAL::Point_2<CGAL::Epeck>>" has no member "Segment_const_reverse_iterator"  CurvedNonogramsGenerator    c:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\Code\CurvedNonogramsGenerator\CurvedNonogramsGenerator\CCBSegmentCirculator.h    33  
Error   C2039   'Segment_const_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>'  CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    28  
Error   C3646   'segment': unknown override specifier   CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    28  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    28  
Error   C2039   'Segment_const_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>'  CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    29  
Error   C3646   'segmentEnd': unknown override specifier    CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    29  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    29  
Error   C2039   'Segment_const_reverse_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>'  CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    32  
Error   C3646   'segmentReverse': unknown override specifier    CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    32  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    32  
Error   C2039   'Segment_const_reverse_iterator': is not a member of 'CGAL::internal::Polycurve_2<SubcurveType_2,PointType_2>'  CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    33  
Error   C3646   'segmentReverseEnd': unknown override specifier CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    33  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    CurvedNonogramsGenerator    c:\users\demeessias\documents\1. studie\0.masterthesis\code\curvednonogramsgenerator\curvednonogramsgenerator\ccbsegmentcirculator.h    33  

回答1:


Replace Segment_const_iterator and Segment_const_reverse_iterator with Subcurve_const_iterator and Subcurve_const_reverse_iterator, respectively.

You probably need to replace begin_segments() and end_segments() with subcurves_begin() and subcurves_end(), respectively.

In version (I think) 4.2 we made significant changes to the code. One of the changes was extending the definition of the polylines supported by the arr_polyline_traits_2 traits class. Now, a polyline can be a chain of linear curves that are not necessarily segments. For example, it can have one or two rays as the first and last pieces, or even a line. (Officially, a piece of the polyline can be any curve that can be constructed from two points).



来源:https://stackoverflow.com/questions/42004649/cgal-doesnt-recognize-type

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!