Skip to content

My project compiles on boost geometry 1.88, but fails on 1.90 #1450

@daryasinilo

Description

@daryasinilo

CE:

[ 22%] Building CXX object CMakeFiles/CORE.dir/Sources/WGS84ToOtherGeoidHeightConvertor.cpp.o
                                                                          /usr/include/boost/geometry/algorithms/detail/overlay/graph/traverse_graph.hpp: In instantiation of 'bool boost::geometry::detail::overlay::traverse_graph<Reverse1, Reverse2, OverlayType, Geometry1, Geometry2, Turns, Clusters, Strategy>::continue_traverse(Ring&, boost::geometry::signed_size_type, boost::geometry::signed_size_type, boost::geometry::signed_size_type) [with Ring = Ring; bool Reverse1 = true; bool Reverse2 = true; boost::geometry::overlay_type OverlayType = boost::geometry::overlay_union; Geometry1 = Polygon; Geometry2 = Multipolygon; Turns = std::deque<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> >, std::allocator<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> > > >; Clusters = std::map<long int, boost::geometry::detail::overlay::cluster_info>; Strategy = boost::geometry::strategies::relate::cartesian<>; boost::geometry::signed_size_type = long int]':
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 /usr/include/boost/geometry/algorithms/detail/overlay/graph/traverse_graph.hpp:330:33:   required from 'void boost::geometry::detail::overlay::traverse_graph<Reverse1, Reverse2, OverlayType, Geometry1, Geometry2, Turns, Clusters, Strategy>::start_traverse(Rings&, const point_type&, boost::geometry::signed_size_type, boost::geometry::signed_size_type, boost::geometry::signed_size_type) [with Rings = std::deque<Ring, std::allocator<Ring> >; bool Reverse1 = true; bool Reverse2 = true; boost::geometry::overlay_type OverlayType = boost::geometry::overlay_union; Geometry1 = Polygon; Geometry2 = Multipolygon; Turns = std::deque<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> >, std::allocator<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> > > >; Clusters = std::map<long int, boost::geometry::detail::overlay::cluster_info>; Strategy = boost::geometry::strategies::relate::cartesian<>; point_type = MyType; boost::geometry::signed_size_type = long int]'
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            330 |             || continue_traverse(ring, component_id, start_node_id, target_node_id);
|                ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/boost/geometry/algorithms/detail/overlay/graph/traverse_graph.hpp:405:31:   required from 'void boost::geometry::detail::overlay::traverse_graph<Reverse1, Reverse2, OverlayType, Geometry1, Geometry2, Turns, Clusters, Strategy>::iterate(Rings&, std::size_t) [with Rings = std::deque<Ring, std::allocator<Ring> >; bool Reverse1 = true; bool Reverse2 = true; boost::geometry::overlay_type OverlayType = boost::geometry::overlay_union; Geometry1 = Polygon; Geometry2 = Multipolygon; Turns = std::deque<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> >, std::allocator<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> > > >; Clusters = std::map<long int, boost::geometry::detail::overlay::cluster_info>; Strategy = boost::geometry::strategies::relate::cartesian<>; std::size_t = long unsigned int]'
                                                                                                               405 |                 start_traverse(rings, turn.point, component_id, source_node_id, target_node_id);
|                 ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/boost/geometry/algorithms/detail/overlay/graph/traverse_graph.hpp:415:20:   required from 'void boost::geometry::detail::overlay::traverse_graph<Reverse1, Reverse2, OverlayType, Geometry1, Geometry2, Turns, Clusters, Strategy>::iterate(Rings&) [with Rings = std::deque<Ring, std::allocator<Ring> >; bool Reverse1 = true; bool Reverse2 = true; boost::geometry::overlay_type OverlayType = boost::geometry::overlay_union; Geometry1 = Polygon; Geometry2 = Multipolygon; Turns = std::deque<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> >, std::allocator<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> > > >; Clusters = std::map<long int, boost::geometry::detail::overlay::cluster_info>; Strategy = boost::geometry::strategies::relate::cartesian<>]'
                                                                                                               415 |             iterate(rings, i);
|             ~~~~~~~^~~~~~~~~~
    /usr/include/boost/geometry/algorithms/detail/overlay/traverse.hpp:78:26:   required from 'static void boost::geometry::detail::overlay::traverse<Reverse1, Reverse2, Geometry1, Geometry2, OverlayType>::apply(const Geometry1&, const Geometry2&, const IntersectionStrategy&, Turns&, Rings&, TurnInfoMap&, Clusters&, Visitor&) [with IntersectionStrategy = boost::geometry::strategies::relate::cartesian<>; Turns = std::deque<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> >, std::allocator<boost::geometry::detail::overlay::traversal_turn_info<MyType, boost::geometry::segment_ratio<double> > > >; Rings = std::deque<Ring, std::allocator<Ring> >; TurnInfoMap = std::map<boost::geometry::ring_identifier, boost::geometry::detail::overlay::ring_turn_info>; Clusters = std::map<long int, boost::geometry::detail::overlay::cluster_info>; Visitor = boost::geometry::detail::overlay::overlay_null_visitor; bool Reverse1 = true; bool Reverse2 = true; Geometry1 = Polygon; Geometry2 = Multipolygon; boost::geometry::overlay_type OverlayType = boost::geometry::overlay_union]'
                                                                                                78 |         traverser.iterate(rings);
|         ~~~~~~~~~~~~~~~~~^~~~~~~
    /usr/include/boost/geometry/algorithms/detail/overlay/overlay.hpp:323:17:   required from 'static OutputIterator boost::geometry::detail::overlay::overlay<Geometry1, Geometry2, Reverse1, Reverse2, ReverseOut, GeometryOut, OverlayType>::apply(const Geometry1&, const Geometry2&, OutputIterator, const Strategy&, Visitor&) [with OutputIterator = boost::geometry::range::back_insert_iterator<QList<Polygon> >; Strategy = boost::geometry::strategies::relate::cartesian<>; Visitor = boost::geometry::detail::overlay::overlay_null_visitor; Geometry1 = Polygon; Geometry2 = Multipolygon; bool Reverse1 = true; bool Reverse2 = true; bool ReverseOut = true; GeometryOut = Polygon; boost::geometry::overlay_type OverlayType = boost::geometry::overlay_union]'
                                                                                                322 |         traverse<Reverse1, Reverse2, Geometry1, Geometry2, OverlayType>::apply
  |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                                         323 |                 (
    |                 ^
      324 |                     geometry1, geometry2,
    |                     ~~~~~~~~~~~~~~~~~~~~~
                          325 |                     strategy,
    |                     ~~~~~~~~~
              326 |                     turns, rings,
    |                     ~~~~~~~~~~~~~
                  327 |                     turn_info_per_ring,
    |                     ~~~~~~~~~~~~~~~~~~~
                        328 |                     clusters,
    |                     ~~~~~~~~~
              329 |                     visitor
      |                     ~~~~~~~
              330 |                 );
|                 ~
    /usr/include/boost/geometry/algorithms/detail/overlay/overlay.hpp:392:21:   [ skipping 4 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
    /usr/include/boost/geometry/algorithms/union.hpp:710:21:   required from 'static void boost::geometry::resolve_strategy::union_<boost::geometry::default_strategy, false>::apply(const Geometry1&, const Geometry2&, Collection&, boost::geometry::default_strategy) [with Geometry1 = Multipolygon; Geometry2 = Polygon; Collection = QList<Polygon>]'
                                                                           707 |         union_
  |         ~~~~~~
         708 |             <
    |             ~
      709 |                 strategy_type
    |                 ~~~~~~~~~~~~~
                  710 |             >::apply(geometry1, geometry2, output_collection, strategy_type());
|             ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/boost/geometry/algorithms/union.hpp:748:21:   required from 'static void boost::geometry::resolve_dynamic::union_<Geometry1, Geometry2, Tag1, Tag2>::apply(const Geometry1&, const Geometry2&, Collection&, const Strategy&) [with Collection = QList<Polygon>; Strategy = boost::geometry::default_strategy; Geometry1 = Multipolygon; Geometry2 = Polygon; Tag1 = boost::geometry::multi_polygon_tag; Tag2 = boost::geometry::polygon_tag]'
                                                                           745 |         resolve_strategy::union_
  |         ~~~~~~~~~~~~~~~~~~~~~~~~
                           746 |             <
    |             ~
      747 |                 Strategy
    |                 ~~~~~~~~
             748 |             >::apply(geometry1, geometry2, output_collection, strategy);
|             ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/boost/geometry/algorithms/union.hpp:847:17:   required from 'void boost::geometry::union_(const Geometry1&, const Geometry2&, Collection&, const Strategy&) [with Geometry1 = Multipolygon; Geometry2 = Polygon; Collection = QList<Polygon>; Strategy = default_strategy]'
                                                                           843 |     resolve_dynamic::union_
  |     ~~~~~~~~~~~~~~~~~~~~~~~
                          844 |         <
    |         ~
      845 |             Geometry1,
    |             ~~~~~~~~~~
               846 |             Geometry2
      |             ~~~~~~~~~
                847 |         >::apply(geometry1, geometry2, output_collection, strategy);
|         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      /sources/BoostGeometry/BoostAreaImpl.h:31:28:   required from 'void MyTypeBoost::AddGeometry(Multipolygon&, Geometry, const Strategy&) [with Geometry = Polygon; Strategy = boost::geometry::default_strategy]'
                                                                              31 |     boost::geometry::union_(mp, std::move(g), res, s);
|     ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
      /sources/BoostGeometry/BoostAreaImpl.h:115:40:   required from 'void MyTypeBoost::BoostAreaImpl<Strategy, Spheroid>::Add(const Polygon&) [with Strategy = boost::geometry::default_strategy; Spheroid = boost::geometry::srs::spheroid<double>]'
                                                                               115 |                             AddGeometry(_mp, val, _strat);
|                             ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
      /sources/BoostGeometry/BoostAreaImpl.h:112:33:   required from here
                                                                               112 |                     inline void Add(const Polygon& val) override
  |                                 ^~~
      /usr/include/boost/geometry/algorithms/detail/overlay/graph/traverse_graph.hpp:228:69: error: 'class Ring' has no member named 'back'
                                                                                                                         228 |                 toi = m_edge_selector.select_target_edge(tois, ring.back(), turn_point);
|                              

My ring register:

#include <boost/geometry/geometries/register/ring.hpp>
#include <boost/geometry/geometries/ring.hpp>
#include <boost/geometry/core/mutable_range.hpp> // for range traits
#include <boost/iterator/iterator_facade.hpp>

namespace Boost
{
class RingIterator: public boost::iterator_facade<RingIterator
                                                   , MyType
                                                   , std::random_access_iterator_tag
                                                   , MyType&
                                                   , std::ptrdiff_t>
{
    friend class boost::iterator_core_access;
    friend class RingConstIterator;

    using iterator_type = std::vector<MyType>::iterator;
    iterator_type _iter;

  public:

    RingIterator():
          _iter()
    {
    }
    explicit RingIterator(iterator_type iter):
          _iter(iter)
    {
    }
    RingIterator(RingIterator const& o): _iter(o._iter){}

  private:
    void increment() { ++_iter; }
    void decrement() { --_iter; }
    void advance(std::ptrdiff_t diff) { std::advance(_iter, diff); }
    std::ptrdiff_t distance_to(RingIterator const& otherIter) const { return std::distance(_iter, otherIter._iter); }
    /*
     * https://www.boost.org/doc/libs/latest/libs/iterator/doc/iterator_facade.html#iterator-facade-requirements
     */
    bool equal(RingIterator const& otherIter) const { return _iter == otherIter._iter; }
    MyType& dereference() const { return *_iter; }
};

class RingConstIterator: public boost::iterator_facade<RingConstIterator
                                                        , MyType
                                                        , std::random_access_iterator_tag
                                                        , const MyType&
                                                        , std::ptrdiff_t>
{
    friend class boost::iterator_core_access;
    using iterator_type = std::vector<MyType>::const_iterator;
    iterator_type _iter;
  public:
    RingConstIterator(): _iter()
    {
    }
    explicit RingConstIterator(iterator_type iter):
          _iter(iter)
    {
    }
    RingConstIterator(const RingIterator& it)
        : _iter(it._iter) // !! friend class !!
    {
    }
    RingConstIterator(RingConstIterator const& o): _iter(o._iter){}

  private:
    void increment() { ++_iter; }
    void decrement() { --_iter; }
    void advance(std::ptrdiff_t diff) { std::advance(_iter, diff); }
    std::ptrdiff_t distance_to(RingConstIterator const& otherIter) const { return std::distance(_iter, otherIter._iter); }
    /*
     * https://www.boost.org/doc/libs/latest/libs/iterator/doc/iterator_facade.html#iterator-facade-requirements
     */
    bool equal(RingConstIterator const& otherIter) const { return _iter == otherIter._iter; }
    const MyType& dereference() const { return *_iter; }
};

}

inline Boost::RingIterator range_begin(Ring& r)
{
    return Boost::RingIterator(r.GetValue().GetTriples().begin());
}
inline Boost::RingIterator range_end(Ring& r)
{
    return Boost::RingIterator(r.GetValue().GetTriples().end());
}
inline Boost::RingConstIterator range_begin(const Ring& r)
{
    return Boost::RingConstIterator(r.GetValue().GetTriples().cbegin());
}
inline Boost::RingConstIterator range_end(const Ring& r)
{
    return Boost::RingConstIterator(r.GetValue().GetTriples().cend());
}

namespace boost
{

template<>
struct range_value<Ring>
{
    using type = MyType;
};

template<>
struct range_iterator<Ring>
{
    using type = Boost::RingIterator;
};
template<>
struct range_const_iterator<Ring>
{
    using type = Boost::RingConstIterator;
};

template<>
struct range_iterator<Ring&>
{
    using type = Boost::RingIterator;
};
template<>
struct range_const_iterator<Ring const&>
{
    using type = Boost::RingConstIterator;
};
}

namespace boost::geometry::traits
{
template<>
struct tag<Ring>
{
    using type = ring_tag;
};

template <>
struct rvalue_type<Ring>
{
    using type = Ring&;
};

template<>
struct clear<Ring>
{
    static inline void apply(Ring& r)
    {
        r.GetValue().clear();
    }
};

template<>
struct push_back<Ring>
{
    static inline void apply(Ring& r, MyType const& p)
    {
        r.GetValue().GetTriples().push_back(p);
    }
    static inline void apply(Ring& r, MyType&& p)
    {
        r.GetValue().GetTriples().push_back(std::move(p));
    }
};

template<>
struct emplace_back<Ring>
{
    template<typename... Args>
    static inline void apply(Ring& r, Args&&... args)
    {
        r.GetValue().GetTriples().emplace_back(std::forward<Args>(args)...);
    }
};

template<>
struct resize<Ring>
{
    using size_type = std::size_t;
    static inline void apply(Ring& r, size_type new_size)
    {
        r.GetValue().GetTriples().resize(new_size);
    }
};

template<>
struct point_order<Ring>
{
    static const order_selector value = counterclockwise;
};

template<>
struct closure<Ring>
{
    static const closure_selector value = closed;
};

}

I want to emphasize this, that it works fine, as expected, on boost geometry 1.88, but after an update, it won't compile. Could you please help me ? I did not find anything about this issue on official documentation or on the web. Thanks in advance!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions