CGAL无法识别类型 [英] CGAL doesn't recognize type

查看:95
本文介绍了CGAL无法识别类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于我的论文项目,我依赖于一年前另一位学生编写的一堆CGAL代码。不幸的是,由于错误,我无法编译代码。这些错误可能不是以前的学生所经历的,因此它们可能与我的设置有关,而不是代码本身,但我不知道直接原因是什么。

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.

错误在文件CCBSegmentCalculator.h中。代码如下:

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

文件 bezier_arrangement.h具有以下代码:

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;

我遇到的错误与CGAL认为已定义的Polyline类型不相关的事实有关。没有成员 Segment_const_iterator ,或者它根本无法正确识别类型。我不确定,因为它已转换为内部CGAL类型。我得到的错误是:

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

对于包含 segment segmentEnd segmentReverse segmentReverseEnd

根据文档 Curve_2 应具有的定义Segment_const_iterator

再次,该错误可能不在于代码本身,而在于我在CGAL的构建/链接中。重新安装CGAL并没有帮助,我可以肯定在相关位置将其链接了,但是构建软件的这一部分并不是我的强项,所以我可能不知道所有相关位置。

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

将CCBSegmentCalculator.h添加到其他项目以仅对其进行编译会产生以下错误:

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  


推荐答案

分别用Subcurve_const_iterator和Subcurve_const_reverse_iterator替换Segment_const_iterator和Segment_const_reverse_iterator。

Replace Segment_const_iterator and Segment_const_reverse_iterator with Subcurve_const_iterator and Subcurve_const_reverse_iterator, respectively.

您可能需要用subcurves_begin替换begin_segments()和end_segments()。 ()和subcurves_end()。

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

在版本4.2(我认为)中,我们对代码进行了重大更改。更改之一是扩展了由arr_polyline_traits_2 traits类支持的折线的定义。现在,折线可以是不一定是线段的线性曲线链。例如,它的第一片和最后片甚至可以有一条或两条线,甚至一条线。 (正式来说,多段线可以是可以由两个点构成的任何曲线。)

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).

这篇关于CGAL无法识别类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆