Сбой с Boost.Геометрия правильная ()

#c #boost #boost-geometry

#c #boost #boost-геометрия

Вопрос:

Я пытаюсь использовать Boost.Геометрия для проекта, и я столкнулся с причудливой ошибкой. Когда я запускаю этот код, он работает так, как ожидалось:

 #include <iostream>

#include <boost/geometry/algorithms/append.hpp>
#include <boost/geometry/algorithms/correct.hpp>
#include <boost/geometry/core/cs.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>

#include <boost/geometry/geometries/adapted/c_array.hpp>
BOOST_GEOMETRY_REGISTER_C_ARRAY_CS(boost::geometry::cs::cartesian);

#include <boost/geometry/geometries/adapted/boost_tuple.hpp>
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(boost::geometry::cs::cartesian)

int main() {
    typedef boost::geometry::model::d2::point_xy<double> point_t;
    typedef boost::geometry::model::polygon<point_t> polygon_t;

    double points_a[][2] = {{0.0, 0.0},
                            {1.0, 0.0},
                            {1.0, 1.0},
                            {0.0, 1.0}};
    polygon_t poly_a;
    boost::geometry::append(poly_a, points_a);

//    boost::geometry::correct(poly_a);

    for(point_t p : boost::geometry::exterior_ring(poly_a)) {
        std::cout << "(" << boost::geometry::get<0>(p) << ", " << boost::geometry::get<1>(p) << ")" << std::endl;
    }
}
  

Когда я раскомментирую строку correct (), я думаю, что получаю ошибку в строке добавления, что для меня не имеет смысла. Вот что выдает мне мой компилятор:

 /opt/clion-2016.2.1/bin/cmake/bin/cmake --build /home/my_user_name/.CLion2016.2/system/cmake/generated/my_project_name-82c1f56b/82c1f56b/Debug --target my_project_name -- -j 8
Scanning dependencies of target my_project_name
[  9%] Building CXX object CMakeFiles/my_project_name.dir/utils/PolygonTest.cpp.o
In file included from /usr/local/boost_1_61_0/boost/concept_check.hpp:27:0,
                 from /usr/local/boost_1_61_0/boost/range/concepts.hpp:19,
                 from /usr/local/boost_1_61_0/boost/range/size_type.hpp:20,
                 from /usr/local/boost_1_61_0/boost/range/size.hpp:21,
                 from /usr/local/boost_1_61_0/boost/range/functions.hpp:20,
                 from /usr/local/boost_1_61_0/boost/range.hpp:18,
                 from /usr/local/boost_1_61_0/boost/geometry/algorithms/append.hpp:24,
                 from /home/my_user_name/ClionProjects/my_project_name/utils/PolygonTest.cpp:7:
/usr/local/boost_1_61_0/boost/geometry/strategies/area.hpp: In instantiation of ‘struct boost::geometry::strategy::area::services::default_strategy<boost::geometry::cartesian_tag, boost::geometry::model::d2::point_xy<double> >’:
/usr/local/boost_1_61_0/boost/geometry/strategies/default_area_result.hpp:42:17:   required from ‘struct boost::geometry::default_area_result<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > >’
/usr/local/boost_1_61_0/boost/geometry/algorithms/correct.hpp:177:57:   required from ‘struct boost::geometry::detail::correct::correct_polygon<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > >’
/usr/local/boost_1_61_0/boost/geometry/algorithms/correct.hpp:245:8:   required from ‘struct boost::geometry::dispatch::correct<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >, boost::geometry::polygon_tag>’
/usr/local/boost_1_61_0/boost/geometry/algorithms/correct.hpp:287:43:   required fromstatic void boost::geometry::resolve_variant::correct<Geometry>::apply(Geometryamp;) [with Geometry = boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >]’
/usr/local/boost_1_61_0/boost/geometry/algorithms/correct.hpp:328:46:   required fromvoid boost::geometry::correct(Geometryamp;) [with Geometry = boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >]’
/home/my_user_name/ClionProjects/my_project_name/utils/PolygonTest.cpp:30:36:   required from here
/usr/local/boost_1_61_0/boost/mpl/assert.hpp:429:42: error: no matching function for call toassertion_failed(mpl_::failed************ (boost::geometry::strategy::area::services::default_strategy<boost::geometry::cartesian_tag, boost::geometry::model::d2::point_xy<double> >::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE::************)(mpl_::assert_::types<boost::geometry::model::d2::point_xy<double>, mpl_::na, mpl_::na, mpl_::na>))’
         boost::mpl::assertion_failed<(c)>( BOOST_PP_CAT(mpl_assert_arg,counter)::assert_arg() ) 
                                          ^
/usr/local/boost_1_61_0/boost/mpl/assert.hpp:60:58: note: in definition of macroBOOST_MPL_AUX_ASSERT_CONSTANT’
 #   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
                                                          ^
/usr/local/boost_1_61_0/boost/mpl/assert.hpp:436:1: note: in expansion of macro ‘BOOST_MPL_ASSERT_MSG_IMPL’
 BOOST_MPL_ASSERT_MSG_IMPL( BOOST_MPL_AUX_PP_COUNTER(), c, msg, types_ ) 
 ^
/usr/local/boost_1_61_0/boost/geometry/strategies/area.hpp:37:5: note: in expansion of macro ‘BOOST_MPL_ASSERT_MSG’
     BOOST_MPL_ASSERT_MSG
     ^
/usr/local/boost_1_61_0/boost/mpl/assert.hpp:83:5: [01;36mnote: candidate: template<bool C> int mpl_::assertion_failed(typename mpl_::assert<C>::type)
 int assertion_failed( typename assert<C>::type );
     ^
/usr/local/boost_1_61_0/boost/mpl/assert.hpp:83:5: note:   template argument deduction/substitution failed:
/usr/local/boost_1_61_0/boost/mpl/assert.hpp:429:92: note:   cannot convert ‘boost::geometry::strategy::area::services::default_strategy<Tag, PointOfSegment>::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE41::assert_arg<boost::geometry::cartesian_tag, boost::geometry::model::d2::point_xy<double> >()’ (type ‘mpl_::failed************ (boost::geometry::strategy::area::services::default_strategy<boost::geometry::cartesian_tag, boost::geometry::model::d2::point_xy<double> >::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE::************)(mpl_::assert_::types<boost::geometry::model::d2::point_xy<double>, mpl_::na, mpl_::na, mpl_::na>)’) to type ‘mpl_::assert<false>::type {aka mpl_::assert<false>}’
         boost::mpl::assertion_failed<(c)>( BOOST_PP_CAT(mpl_assert_arg,counter)::assert_arg() ) 
                                                                                            ^
/usr/local/boost_1_61_0/boost/mpl/assert.hpp:60:58: note: in definition of macro ‘BOOST_MPL_AUX_ASSERT_CONSTANT’
 #   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
                                                          ^
/usr/local/boost_1_61_0/boost/mpl/assert.hpp:436:1: note: in expansion of macro ‘BOOST_MPL_ASSERT_MSG_IMPL’
 BOOST_MPL_ASSERT_MSG_IMPL( BOOST_MPL_AUX_PP_COUNTER(), c, msg, types_ ) 
 ^
/usr/local/boost_1_61_0/boost/geometry/strategies/area.hpp:37:5: note: in expansion of macro ‘BOOST_MPL_ASSERT_MSG’
     BOOST_MPL_ASSERT_MSG
     ^
In file included from /usr/local/boost_1_61_0/boost/geometry/algorithms/area.hpp:42:0,
                 from /usr/local/boost_1_61_0/boost/geometry/algorithms/correct.hpp:43,
                 from /home/my_user_name/ClionProjects/my_project_name/utils/PolygonTest.cpp:8:
/usr/local/boost_1_61_0/boost/geometry/strategies/default_area_result.hpp: In instantiation of ‘struct boost::geometry::default_area_result<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > >’:
/usr/local/boost_1_61_0/boost/geometry/algorithms/correct.hpp:177:57:   required from ‘struct boost::geometry::detail::correct::correct_polygon<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > >’
/usr/local/boost_1_61_0/boost/geometry/algorithms/correct.hpp:245:8:   required from ‘struct boost::geometry::dispatch::correct<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >, boost::geometry::polygon_tag>’
/usr/local/boost_1_61_0/boost/geometry/algorithms/correct.hpp:287:43:   required fromstatic void boost::geometry::resolve_variant::correct<Geometry>::apply(Geometryamp;) [with Geometry = boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >]’
/usr/local/boost_1_61_0/boost/geometry/algorithms/correct.hpp:328:46:   required fromvoid boost::geometry::correct(Geometryamp;) [with Geometry = boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >]’
/home/my_user_name/ClionProjects/my_project_name/utils/PolygonTest.cpp:30:36:   required from here
/usr/local/boost_1_61_0/boost/geometry/strategies/default_area_result.hpp:42:17: error: no type named ‘type’ in ‘struct boost::geometry::strategy::area::services::default_strategy<boost::geometry::cartesian_tag, boost::geometry::model::d2::point_xy<double> >’
         >::type strategy_type;
                 ^
CMakeFiles/my_project_name.dir/build.make:278: recipe for target 'CMakeFiles/my_project_name.dir/utils/PolygonTest.cpp.o' failed
make[3]: *** [CMakeFiles/my_project_name.dir/utils/PolygonTest.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/my_project_name.dir/all' failed
make[2]: *** [CMakeFiles/my_project_name.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/my_project_name.dir/rule' failed
make[1]: *** [CMakeFiles/my_project_name.dir/rule] Error 2
Makefile:118: recipe for target 'my_project_name' failed
make: *** [my_project_name] Error 2
  

Я использую CLion в Ubuntu, если это поможет.

Спасибо!

РЕДАКТИРОВАТЬ: я только что нашел решение! Из приведенного ниже комментария я понял, что мне пришлось покопаться в boost / geometry.hpp, где была определена стратегия области для point_xy , и я нашел boost / geometry /strategies / strategies.hpp , включение которого устранило проблему.

Ответ №1:

Стратегия области отсутствует:

         /usr/local/boost_1_61_0/boost/mpl/assert.hpp:429:42: error: no matching function for call toassertion_failed(mpl_::failed************
 (boost::geometry::strategy::area::services::default_strategy<boost::geometry::cartesian_tag, boost::geometry::model::d2::point_xy<double> >::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE::************)(mpl_::assert_::types<boost::geometry::model::d2::point_xy<double>, mpl_::na, mpl_::na, mpl_::na>))’
             boost::mpl::assertion_failed<(c)>( BOOST_PP_CAT(mpl_assert_arg,counter)::assert_arg() ) 
  

Просто добавьте

 #include <boost/geometry.hpp>
  

вместо явного включения алгоритмов

Комментарии:

1. Спасибо! Я сделал это, и это устранило проблему, но я действительно не хочу включать всю библиотеку в этот проект. Я попытался просто импортировать boost / geometry / strategies /area.hpp , но это не сработало. Есть ли какая-то регистрация, которую я должен выполнить? Знаете ли вы, почему включение всей геометрии устраняет проблему? Еще раз, большое спасибо!

2. Неважно, я только что понял, что мне нужно включить boost / geometry / strategies / strategies.hpp . Это позволяет ему работать без использования всей библиотеки.