Почему этот код Boost R-tree не компилируется?

Я использую буст 1.61

Компиляция с VS2015

Следующий код не будет компилироваться. Это должно делать --- Я думаю, что использование адаптера BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET расстраивает ситуацию.

Любая идея, почему это не работает или как я могу это исправить?

#include <boost/geometry/geometry.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/io/wkt/wkt.hpp>
#include <vector>
#include <boost/geometry/geometries/register/point.hpp>

class wxPoint
{
public:
    wxPoint(double x, double y)
        : m_x(x),
          m_y(y)
    {
    }

    wxPoint() {}

    double  getx() const
    {
        return m_x;
    }
    double gety() const
    {
        return m_y;
    }
    void setx(double in)
    {
        m_x = in;
    }
    void sety(double in)
    {
        m_y = in;
    }
private:
    double m_x;
    double m_y;
};

BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(
    wxPoint,
    double,
    boost::geometry::cs::geographic<boost::geometry::degree>,
    wxPoint::getx,
    wxPoint::gety,
    wxPoint::setx,
    wxPoint::sety)


typedef std::pair<wxPoint, unsigned> value;


int main()
{

    boost::geometry::index::rtree< value, boost::geometry::index::quadratic<16> > rtree;

    wxPoint p(4, 1);

    rtree.insert(std::make_pair(p, 1));

    std::vector<value> result_s;

    typedef boost::geometry::model::polygon<wxPoint> polygon_type;

    polygon_type poly;
    boost::geometry::read_wkt(
        "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 3,5.3 2.6,5.4 1.2,4.9 0.8,2.9 0.7,2 1.3)"
        "(4.0 2.0, 4.2 1.4, 4.8 1.9, 4.4 2.2, 4.0 2.0))", poly);

    rtree.query(boost::geometry::index::within(poly), std::back_inserter(result_s));

    return 0;
}

Вот сводная информация от компилятора VC:

Severity    Code    Description Project File    Line    Suppression State
Error   C2672   'boost::geometry::strategy::intersection::relate_cartesian_segments<boost::geometry::policies::relate::segments_tupled<boost::geometry::policies::relate::segments_intersection_points<boost::geometry::segment_intersection_points<IntersectionPoint,boost::geometry::segment_ratio<double>>>,boost::geometry::policies::relate::segments_direction>,CalculationType>::apply': no matching overloaded function found   scratch1    c:\users\simon\downloads\boost_1_61_0\boost_1_61_0\boost\geometry\algorithms\detail\overlay\get_turn_info_helpers.hpp   230 
Error   C2782   'boost::tuples::tuple<boost::geometry::segment_intersection_points<IntersectionPoint,boost::geometry::segment_ratio<double>>,boost::geometry::policies::relate::segments_direction::return_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> boost::geometry::strategy::intersection::relate_cartesian_segments<boost::geometry::policies::relate::segments_tupled<boost::geometry::policies::relate::segments_intersection_points<boost::geometry::segment_intersection_points<IntersectionPoint,boost::geometry::segment_ratio<double>>>,boost::geometry::policies::relate::segments_direction>,CalculationType>::apply(const Segment1 &,const Segment2 &,const RobustPolicy &,const RobustPoint &,const RobustPoint &,const RobustPoint &,const RobustPoint &)': template parameter 'RobustPoint' is ambiguous   scratch1    c:\users\simon\downloads\boost_1_61_0\boost_1_61_0\boost\geometry\algorithms\detail\overlay\get_turn_info_helpers.hpp   230 
Error   C2784   'boost::tuples::tuple<boost::geometry::segment_intersection_points<IntersectionPoint,boost::geometry::segment_ratio<double>>,boost::geometry::policies::relate::segments_direction::return_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> boost::geometry::strategy::intersection::relate_cartesian_segments<boost::geometry::policies::relate::segments_tupled<boost::geometry::policies::relate::segments_intersection_points<boost::geometry::segment_intersection_points<IntersectionPoint,boost::geometry::segment_ratio<double>>>,boost::geometry::policies::relate::segments_direction>,CalculationType>::apply(const Segment1 &,const Segment2 &,const RobustPolicy &,const RobustPoint &,const RobustPoint &,const RobustPoint &,const RobustPoint &)': could not deduce template argument for 'const RobustPoint &' from 'const boost::geometry::model::point<double,2,boost::geometry::cs::geographic<boost::geometry::degree>>'  scratch1    c:\users\simon\downloads\boost_1_61_0\boost_1_61_0\boost\geometry\algorithms\detail\overlay\get_turn_info_helpers.hpp   230 
Error   C2780   'boost::tuples::tuple<boost::geometry::segment_intersection_points<IntersectionPoint,boost::geometry::segment_ratio<double>>,boost::geometry::policies::relate::segments_direction::return_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> boost::geometry::strategy::intersection::relate_cartesian_segments<boost::geometry::policies::relate::segments_tupled<boost::geometry::policies::relate::segments_intersection_points<boost::geometry::segment_intersection_points<IntersectionPoint,boost::geometry::segment_ratio<double>>>,boost::geometry::policies::relate::segments_direction>,CalculationType>::apply(const Segment1 &,const Segment2 &,const RobustPolicy &)': expects 3 arguments - 7 provided    scratch1    c:\users\simon\downloads\boost_1_61_0\boost_1_61_0\boost\geometry\algorithms\detail\overlay\get_turn_info_helpers.hpp   230 

А вот более подробный вывод компилятора


person Simon Katz    schedule 21.07.2016    source источник
comment
Пожалуйста, размещайте сообщения об ошибках непосредственно в вопросе в виде простого текста.   -  person Jesper Juhl    schedule 21.07.2016
comment
Я бы сделал это, но вывод был слишком большим, чтобы StackOverflow разрешил   -  person Simon Katz    schedule 21.07.2016
comment
Бьюсь об заклад, вы могли бы вырезать некоторые нерелевантные части, показать наиболее важные фрагменты, а затем просто сослаться на остальные :)   -  person Jesper Juhl    schedule 21.07.2016
comment
Это может привести к потере потенциально важной информации. Я не могу сказать, что важно, а что нет --- это просто невероятная масса шаблонной болтовни. Это большая часть проблемы! Однако я попробую.   -  person Simon Katz    schedule 21.07.2016


Ответы (1)


Это было вызвано ошибкой, больше информации здесь: https://svn.boost.org/trac/boost/ticket/12189 и здесь: https://svn.boost.org/trac/boost/ticket/12342

Есть несколько возможных обходных путей:

  • передать Polygon, используя bg::model::point
  • передать Box вместо Polygon
  • примените исправление, указанное на странице отслеживания ошибок (выше), к вашей локальной копии Boost 1.61.
  • обновить до буста 1.62
person Adam Wulkiewicz    schedule 08.01.2017