Я пытаюсь выяснить, how boost::geometry
for_each_segment
работает.Документация говорит мне, что for_each_segment
ожидает геометрию и функтор.В моем примере этот функтор называется polylength_helper
, пока этот фрагмент не компилируется, я просто увеличиваю число там, чтобы все было просто, пока он не скомпилируется.
// foo.h
typedef boost::geometry::model::point<double, 2, bg::cs::cartesian> GeographicPoint;
typedef boost::geometry::model::linestring<GeographicPoint> GeographicPolyLine;
typedef boost::geometry::model::segment<GeographicPoint> GeographicSegment;
double poly_length(const GeographicPolyLine&);
template<typename Segment>
struct polylength_helper{
polylength_helper() : length(0){};
inline void operator()(Segment s){
length += 1;
};
double length;
};
// foo.cpp
double poly_length(GeographicPolyLine &poly){
polylength_helper<GeographicSegment> helper;
bg::for_each_segment(poly, helper);
return helper.length;
}
Ну, это не компилируется.Я использовал clang
для более понятного вывода, он говорит:
note: candidate function not viable: no known
conversion from 'model::referring_segment<point_type>' to
'boost::geometry::model::segment<boost::geometry::model::point<double, 2,
boost::geometry::cs::cartesian> >' for 1st argument
inline void operator()(Segment s){
^
Кто-нибудь может мне помочь?Особенно я понятия не имею, откуда взято referring_segment
в сообщении.
Вот пример из документов:
http://www.boost.org/doc/libs/1_48_0/libs/geometry/doc/html/geometry/reference/algorithms/for_each/for_each_segment_2_const_version.html
Но я не могу понятьчем это отличается от моей версии, кроме typedef
s.