简体   繁体   English

CGAL无法识别类型

[英]CGAL doesn't recognize type

For my thesis project I am dependent on a bunch of CGAL code written by another student a year ago. 对于我的论文项目,我依赖于一年前另一位学生编写的一堆CGAL代码。 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. 错误在文件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: 文件“ bezier_arrangement.h”具有以下代码:

#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. 我遇到的错误与以下事实有关:CGAL认为定义的Polyline类型没有成员Segment_const_iterator ,或者它根本无法正确识别该类型。 I'm not sure, due to it being translated into an internal CGAL type. 我不确定,因为它已转换为内部CGAL类型。 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 . 对包含segmentsegmentEndsegmentReversesegmentReverseEnd的定义的行重复。

According to the documentation , Curve_2 should have a definition for Segment_const_iterator . 根据该文件Curve_2应该有一个定义Segment_const_iterator

Once again, the error is probably not in the code itself, but in my build/linking of CGAL somewhere. 再一次,错误可能不在于代码本身,而在于我在CGAL的构建/链接中。 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. 重新安装CGAL并没有帮助,我可以肯定在相关位置将其链接了,但是构建软件的这一部分并不是我的强项,因此我可能不知道所有相关方面。

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: 将CCBSegmentCalculator.h添加到其他项目以仅对其进行编译会产生以下错误:

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  

Replace Segment_const_iterator and Segment_const_reverse_iterator with Subcurve_const_iterator and Subcurve_const_reverse_iterator, respectively. 分别用Subcurve_const_iterator和Subcurve_const_reverse_iterator替换Segment_const_iterator和Segment_const_reverse_iterator。

You probably need to replace begin_segments() and end_segments() with subcurves_begin() and subcurves_end(), respectively. 您可能需要分别用subcurves_begin()和subcurves_end()替换begin_segments()和end_segments()。

In version (I think) 4.2 we made significant changes to the code. 在我认为的4.2版本中,我们对代码进行了重大更改。 One of the changes was extending the definition of the polylines supported by the arr_polyline_traits_2 traits class. 更改之一是扩展了由arr_polyline_traits_2 traits类支持的折线的定义。 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). (通常,一条折线可以是可以由两个点构成的任何曲线)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM