Boost Geometry:assertion_failed错误C++

3

我有以下的头文件以使用boost几何类型:

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>
#include <boost/geometry/geometries/register/point.hpp>

using namespace boost::geometry;
using namespace detail::assign;

typedef model::d2::point_xy<double> point_xy;
typedef model::polygon<point_xy> polygon;
typedef model::multi_polygon<polygon> multi_polygon;
typedef model::box<point_xy> box;

当我编译一个试图使用这些类型的文件时,我会得到一个大量的编译器错误:

In file included from src/geometry.cpp:11:
In file included from src/../include/geometry.hpp:9:
In file included from /usr/local/include/boost/geometry.hpp:17:
In file included from /usr/local/include/boost/geometry/geometry.hpp:26:
In file included from /usr/local/include/boost/geometry/core/coordinate_dimension.hpp:23:
/usr/local/include/boost/geometry/core/point_type.hpp:45:5: error: no matching function for call to 'assertion_failed'
    BOOST_MPL_ASSERT_MSG
    ^~~~~~~~~~~~~~~~~~~~
/usr/local/include/boost/mpl/assert.hpp:454:51: note: expanded from macro 'BOOST_MPL_ASSERT_MSG'
#   define BOOST_MPL_ASSERT_MSG( c, msg, types_ ) \
                                                  ^
/usr/local/include/boost/mpl/assert.hpp:440:9: note: expanded from macro '\
BOOST_MPL_ASSERT_MSG_IMPL'
        boost::mpl::assertion_failed<(c)>( BOOST_PP_CAT(mpl_assert_arg,counter)::assert_arg() ) \
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/boost/mpl/assert.hpp:60:58: note: expanded from macro '\
BOOST_MPL_AUX_ASSERT_CONSTANT'
#   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
                                                         ^~~~
/usr/local/include/boost/geometry/core/point_type.hpp:65:30: note: in instantiation of template class
      'boost::geometry::traits::point_type<std::__1::vector<float, std::__1::allocator<float> > >' requested here
            typename traits::point_type<Geometry>::type
                             ^
/usr/local/include/boost/geometry/core/coordinate_type.hpp:58:22: note: in instantiation of template class 'boost::geometry::core_dispatch::point_type<void,
      std::__1::vector<float, std::__1::allocator<float> > >' requested here
    typedef typename point_type<GeometryTag, Geometry>::type point_type;
                     ^
/usr/local/include/boost/geometry/core/coordinate_type.hpp:88:37: note: in instantiation of template class 'boost::geometry::core_dispatch::coordinate_type<void,
      std::__1::vector<float, std::__1::allocator<float> > >' requested here
    typedef typename core_dispatch::coordinate_type
                                    ^
/usr/local/include/boost/geometry/core/access.hpp:269:17: note: in instantiation of template class 'boost::geometry::coordinate_type<std::__1::vector<float,
      std::__1::allocator<float> > >' requested here
inline typename coordinate_type<Geometry>::type get(Geometry const& geometry
                ^
/usr/local/include/boost/geometry/algorithms/detail/convert_point_to_point.hpp:42:74: note: while substituting deduced template arguments into function template
      'get' [with Dimension = 0, Geometry = std::__1::vector<float, std::__1::allocator<float> >]
        set<Dimension>(destination, boost::numeric_cast<coordinate_type>(get<Dimension>(source)));
                                                                         ^
/usr/local/include/boost/geometry/algorithms/detail/convert_point_to_point.hpp:58:76: note: (skipping 3 contexts in backtrace; use -ftemplate-backtrace-limit=0
      to see all)
    point_to_point<Source, Destination, 0, dimension<Destination>::value>::apply(source, destination);
                                                                           ^
/usr/local/include/boost/geometry/algorithms/append.hpp:129:45: note: in instantiation of member function
      'boost::geometry::detail::append::append_range<boost::geometry::model::ring<boost::geometry::model::d2::point_xy<double, boost::geometry::cs::cartesian>,
      true, true, vector, allocator>, std::__1::vector<std::__1::vector<float, std::__1::allocator<float> >, std::__1::allocator<std::__1::vector<float,
      std::__1::allocator<float> > > > >::apply' requested here
            append_range<ring_type, Range>::apply(
                                            ^
/usr/local/include/boost/geometry/algorithms/append.hpp:296:51: note: in instantiation of member function
      'boost::geometry::detail::append::range_to_polygon<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double,
      boost::geometry::cs::cartesian>, true, true, std::vector, std::vector, std::allocator, std::allocator>, std::__1::vector<std::__1::vector<float,
      std::__1::allocator<float> >, std::__1::allocator<std::__1::vector<float, std::__1::allocator<float> > > > >::apply' requested here
        dispatch::append<Geometry, RangeOrPoint>::apply(geometry,
                                                  ^
/usr/local/include/boost/geometry/algorithms/append.hpp:371:22: note: in instantiation of function template specialization
      'boost::geometry::resolve_variant::append<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double, boost::geometry::cs::cartesian>,
      true, true, std::vector, std::vector, std::allocator, std::allocator> >::apply<std::__1::vector<std::__1::vector<float, std::__1::allocator<float> >,
      std::__1::allocator<std::__1::vector<float, std::__1::allocator<float> > > > >' requested here
                   ::apply(geometry, range_or_point, ring_index, multi_index);
                     ^
/usr/local/include/boost/geometry/algorithms/assign.hpp:75:15: note: in instantiation of function template specialization
      'boost::geometry::append<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double, boost::geometry::cs::cartesian>, true, true,
      std::vector, std::vector, std::allocator, std::allocator>, std::__1::vector<std::__1::vector<float, std::__1::allocator<float> >,
      std::__1::allocator<std::__1::vector<float, std::__1::allocator<float> > > > >' requested here
    geometry::append(geometry, range, -1, 0);
              ^
src/geometry.cpp:213:5: note: in instantiation of function template specialization
      'boost::geometry::assign_points<boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double, boost::geometry::cs::cartesian>, true, true,
      std::vector, std::vector, std::allocator, std::allocator>, std::__1::vector<std::__1::vector<float, std::__1::allocator<float> >,
      std::__1::allocator<std::__1::vector<float, std::__1::allocator<float> > > > >' requested here
    assign_points(poly, shape.border);
    ^
/usr/local/include/boost/mpl/assert.hpp:83:5: note: candidate function not viable: no known conversion from 'boost::mpl::failed
      ************(boost::geometry::traits::point_type<std::__1::vector<float, std::__1::allocator<float> >
      >::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE::************)(types<std::__1::vector<float, std::__1::allocator<float> > >)' to 'typename assert<false>::type'
      (aka 'mpl_::assert<false>') for 1st argument
int assertion_failed( typename assert<C>::type );
    ^
In file included from src/geometry.cpp:11:
In file included from src/../include/geometry.hpp:9:
In file included from /usr/local/include/boost/geometry.hpp:17:
In file included from /usr/local/include/boost/geometry/geometry.hpp:28:
/usr/local/include/boost/geometry/core/coordinate_type.hpp:43:5: error: no matching function for call to 'assertion_failed'
    BOOST_MPL_ASSERT_MSG
    ^~~~~~~~~~~~~~~~~~~~
/usr/local/include/boost/mpl/assert.hpp:454:51: note: expanded from macro 'BOOST_MPL_ASSERT_MSG'
#   define BOOST_MPL_ASSERT_MSG( c, msg, types_ ) \

我看到了这个帖子,他们没有注册元组 - 但是,我并没有使用元组或任何特殊的点 - 我只是试图使用内置的几何类型。为什么这个错误仍然会发生?

1个回答

2

如您所见,所发布的代码本身并没有问题:在Coliru上测试

因此,一定有其他东西在干扰。我有三个猜测:

  1. It's somewhere else in your code that you didn't post. The cause of the error is in ../src/geometry.cpp (not Boost library):

    assign_points(poly, shape.border);
    

    That gives you good ideas on how to reduce to a MCVE.

  2. You have preprocessor issues. Try pre-processing your sources and see whether any of the code appearing in the error messages looks suspect.

    A classical example of this would be if some other included header defines tokens like #define min(a,b) ... or other commonly used words.

    Side note: this is about code-hygiene. A related note is the appearance of using namespace in your shown code snippet. This just begs namespace collisions or unintended effects.

  3. Slightly related: the source of the interference could have to do with pre-compiled headers. Try disabling those or making sure you know what is in the PCH header (especially on MSVC (commonly using stdafx.h) precompiled headers have some potentially surprising effects)

更新

我想我找到了问题所在:位于src/geometry.cpp的第213行第5列的有问题的代码调用了:

assign_points(poly, shape.border);

类型为:poly

boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double, boost::geometry::cs::cartesian>, true, true, std::vector, std::vector, std::allocator, std::allocator>,

这是您上面展示的“polygon” typedef。但“shape.border”是:
std::__1::vector<std::__1::vector<float, std::__1::allocator<float>>, std::__1::allocator<std::__1::vector<float, std::__1::allocator<float>>>>>

这只是vector<std :: vector<float>>,它不是受支持的几何形状。


1
添加了一项更新,显示您正在从不兼容的 shape.border 类型进行赋值。 - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接