gpt4 book ai didi

compiler-errors - 'result_type': 不是 '` Traits'::Less_xy_2' 的成员

转载 作者:行者123 更新时间:2023-12-02 10:58:25 26 4
gpt4 key购买 nike

我试图使用 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 标准之后,就没有必要添加这个了,因为从那个版本开始,为了同样的目的,struct result_of 被引入了。 (参见,例如,the cplusplus result_of reference)。相反,在 C++11 之前,用户应该手动定义 result_type (以及最终的参数类型)用于每个可调整的函数对象,如 the old SGI overview of function objects 中所述.在 CGAL 中,有些算法使用了已被 C++ 标准弃用或删除的结构(参见 the CGAL::cpp98 namespace reference)。必须定义 result_type 的原因是为了让那些算法能够正确编译。
  • 关于compiler-errors - 'result_type': 不是 '` Traits'::Less_xy_2' 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52871535/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com