compiler-errors - 'result_type': 不是 '`Traits'::Less_xy_2' 的成员
问题描述
我试图使用 CGAL 计算一组 2D 点的凸包。我想定义我自己的Traits类,试图遵循 CGAL ConvexHullTraits_2 Concept Reference。我报告我写的代码:
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/convex_hull_2.h>
#include <CGAL/convex_hull_traits_2.h>
using namespace std;
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
typedef pair<Point_2, unsigned> Point_with_info;
typedef CGAL::Convex_hull_traits_2<K> DefaultTraits;
class NewTraits
{
public:
typedef Point_with_info Point_2;
class Equal_2
{
public:
bool operator()(Point_2 p, Point_2 q)
{
return DefaultTraits::Equal_2()(p.first, q.first);
}
};
class Less_xy_2
{
public:
bool operator()(Point_2 p, Point_2 q)
{
return DefaultTraits::Less_xy_2()(p.first, q.first);
}
};
class Less_yx_2
{
public:
bool operator()(Point_2 p, Point_2 q)
{
return DefaultTraits::Less_yx_2()(p.first, q.first);
}
};
class Left_turn_2
{
public:
bool operator()(Point_2 p, Point_2 q, Point_2 r) const
{
return DefaultTraits::Left_turn_2()(p.first, q.first, r.first);
}
};
class Less_signed_distance_to_line_2
{
public:
bool operator()(Point_2 p, Point_2 q, Point_2 r, Point_2 s)
{
return DefaultTraits::Less_signed_distance_to_line_2()(p.first, q.first, r.first, s.first);
}
};
class Less_rotate_ccw_2
{
public:
bool operator()(Point_2 e, Point_2 p, Point_2 q)
{
return DefaultTraits::Less_rotate_ccw_2()(e.first, p.first, q.first);
}
};
class Orientation_2
{
public:
CGAL::Orientation operator()(Point_2 e, Point_2 p, Point_2 q)
{
return DefaultTraits::Orientation_2()(e.first, p.first, q.first);
}
};
NewTraits(NewTraits &t) {};
NewTraits() {};
Equal_2 equal_2_object() const
{
return Equal_2();
}
Less_xy_2 less_xy_2_object() const
{
return Less_xy_2();
}
Less_yx_2 less_yx_2_object() const
{
return Less_yx_2();
}
Less_signed_distance_to_line_2 less_signed_distance_to_line_2_object()
{
return Less_signed_distance_to_line_2();
}
Less_rotate_ccw_2 less_rotate_ccw_2_object()
{
return Less_rotate_ccw_2();
}
Left_turn_2 left_turn_2_object() const
{
return Left_turn_2();
}
Orientation_2 orientation_2_object() const
{
return Orientation_2();
}
};
typedef vector<Point_with_info> Set_of_points_with_info;
int main()
{
Set_of_points_with_info points;
Set_of_points_with_info result;
for (int i = 0; i < 5; i++)
{
points.push_back(make_pair(Point_2(i, i), i));
}
CGAL::convex_hull_2(points.begin(), points.end(), back_inserter(result), NewTraits());
return 0;
}
如果我编译上面的代码,我会收到以下错误:
Error C2039 'result_type': is not a member of 'NewTraits::Less_xy_2'
typedef K::Less_xy_2::result_type result_type;
我可以通过添加到类来修复编译错误NewTraits::Less_xy_2
。
我的问题是:
- 这是解决问题的正确方法吗?
- 即使文档没有说明,为什么我还要添加此成员?
解决方案
- 是的,修复是正确的。
- 您应该
result_type
出于向后兼容性的原因添加。事实上,NewTraits::Less_xy_2
是一个二元谓词,因此是一个函子。在采用 C++11 标准之后,就不再需要这种添加了,因为从那个版本开始,为了同样的目的引入了结构体result_of
(例如,参见cplusplus result_of参考)。相反,在 C++11 之前,用户应该result_type
为每个可适应的函数对象手动定义(并最终定义参数类型),如旧的 SGI函数对象概述中所述。在 CGAL 中,有些算法使用的结构已被C++ 标准弃用或删除(参见CGAL::cpp98命名空间参考)。您必须定义的原因result_type
是为了允许这些算法正确编译。
推荐阅读
- memory - 在 Flink 中(在 yarn,per-Job 模式下),为什么 taskmanager.log 中的最大堆大小不等于 'xmx' 的值?
- python - Django 模型序列化器
- python - django bootstrap navbar 下拉元素在使用相同的 base.html 时没有出现在其他 url
- r - 根据 R 中的日期序列填充行
- tensorflow - 用于时间序列预测的编码器解码器
- c - 为什么我在 C malloc 结束时得到一个垃圾值?
- javascript - Why does the script make all the elements work simultaneously and not like they are separate objects
- linux - how to add multiple files in Linker_Flag variable in scilab?
- rest - 有没有办法使用 API 列出拉取请求文件(来自源分支)及其在 Azure Devops 中的位置?还有其他使用 C# 的方法吗?
- python - 如何在unittest python中的startTest()之前运行setup()