2016-10-22 76 views
2

我想爲項目使用Boost.Geometry,並且遇到了一個奇怪的錯誤。當我運行這段代碼,它按預期工作:Boost.Geometry失敗()

#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; 
    } 
} 

當我去掉了正確的()行,我覺得我得到的追加線,這是沒有意義的,以我的錯誤。這是我的編譯器給我的:

/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 from ‘static void boost::geometry::resolve_variant::correct<Geometry>::apply(Geometry&) [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 from ‘void boost::geometry::correct(Geometry&) [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 to ‘assertion_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 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 
    ^
/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 from ‘static void boost::geometry::resolve_variant::correct<Geometry>::apply(Geometry&) [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 from ‘void boost::geometry::correct(Geometry&) [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 

我在Ubuntu上使用CLion,如果有幫助的話。

謝謝!

編輯:我只是想出瞭解決方案!從下面的評論中,我意識到我不得不在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 to 
    ‘assertion_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> 

,而不是包括算法明確

+0

謝謝!我這樣做,它解決了這個問題,但我真的不希望在整個項目中包含整個庫。我試着只導入boost/geometry/strategies/area.hpp,但是這沒有奏效。我需要做某種註冊嗎?你知道爲什麼包括整個幾何圖形可以解決這個問題嗎?再次,非常感謝! – homosapien97

+0

沒關係,我剛纔發現我需要包含boost/geometry/strategies/strategies.hpp。這使得它沒有整個圖書館的工作。 – homosapien97