'result_type': не является членом 'Traits' :: Less_xy_2 ' - PullRequest
0 голосов
/ 18 октября 2018

Я пытался вычислить выпуклую оболочку набора двумерных точек, используя CGAL.Я хотел определить свой собственный класс Traits , пытаясь следовать CGAL ConvexHullTraits_2 Reference 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.

Мои вопросы:

  • Это правильный способ решить проблему?
  • Почему я должен добавить этого участника, даже если в документации это не сказано?

1 Ответ

0 голосов
/ 18 октября 2018
  • Да, исправление верно.
  • Вы должны добавить result_type по причине обратной совместимости.Фактически, NewTraits::Less_xy_2 - это двоичный предикат, следовательно, функтор.После принятия стандарта C ++ 11 в этом дополнении не будет необходимости, поскольку из этой ревизии для той же цели была введена структура result_of (см. например, , cplusplus). result_of ссылка ).До C ++ 11 вместо этого пользователь должен был вручную определять result_type (и, возможно, типы аргументов) для каждого адаптируемого функционального объекта, как объяснено в старом обзоре SGI функциональных объектов .В CGAL есть алгоритмы, которые используют структуры, которые устарели или удалены из стандарта C ++ (см. CGAL :: cpp98 ссылка на пространство имен ).Причина, по которой вы должны определить result_type, заключается в том, что эти алгоритмы должны правильно компилироваться.
...