Boost logo

Boost Users :

Subject: [Boost-users] Weird compilation error when using boost::geometry
From: é‚“å°§ (torshie_at_[hidden])
Date: 2015-09-19 02:08:56


Hi,

I have implemented my own "point" as specified by the point concept
http://www.boost.org/doc/libs/1_59_0/libs/geometry/doc/html/geometry/reference/concepts/concept_point.html
When I use it along with boost::geometry::model::polygon/multi_polygon, GCC
refuses to compile, tested on GCC 4.9/5.2. What's even more weird is that
CLANG 3.6 would happy accept my code.

BTW, the Point implementation is part of a large project, it difficult to
replace it with boost::geometry::model::point.

Here is my code: Point.hpp

> #ifndef RAPTOR_POINT_HPP_INCLUDED_
>
> #define RAPTOR_POINT_HPP_INCLUDED_
>
>
>> #include <boost/mpl/int.hpp>
>
> #include <boost/geometry/core/access.hpp>
>
> #include <boost/geometry/core/cs.hpp>
>
> #include <boost/geometry/core/coordinate_type.hpp>
>
> #include <boost/geometry/core/coordinate_system.hpp>
>
> #include <boost/geometry/core/coordinate_dimension.hpp>
>
> #include <boost/geometry/geometries/polygon.hpp>
>
> #include <boost/geometry/multi/geometries/multi_polygon.hpp>
>
>
>> namespace raptor {
>
>
>> template<typename T, int tDimension = 2>
>
> class Point {
>
> public:
>
> Point() = default;
>
>
>> Point(T a, T b) {
>
> data[0] = a;
>
> data[1] = b;
>
> }
>
>
>> Point(T a, T b, T c) {
>
> data[0] = a;
>
> data[1] = b;
>
> data[2] = c;
>
> }
>
>
>> T& operator [] (long index) {
>
> return data[index];
>
> }
>
>
>> const T& operator [] (long index) const {
>
> return data[index];
>
> }
>
>
>> private:
>
> T data[tDimension];
>
> };
>
>
>> using CubicPoint = Point<long, 3>;
>
> using PlanarPoint = Point<long>;
>
> using SphericalPoint = Point<double>;
>
>
>> template<typename T>
>
> using Polygon = boost::geometry::model::polygon<T>;
>
>
>> template<typename T>
>
> using PolySet = boost::geometry::model::multi_polygon<Polygon<T>>;
>
>
>> } // namespace raptor
>
>
>> namespace boost { namespace geometry { namespace traits {
>
>
>> template<typename Type, std::size_t tDimension>
>
> struct tag<::raptor::Point<Type, tDimension>> {
>
> typedef point_tag type;
>
> };
>
>
>> template<typename Type, std::size_t tDimension>
>
> struct coordinate_type<::raptor::Point<Type, tDimension>> {
>
> typedef Type type;
>
> };
>
>
>> template<typename Type, std::size_t tDimension>
>
> struct coordinate_system<::raptor::Point<Type, tDimension>> {
>
> typedef boost::geometry::cs::cartesian type;
>
> };
>
>
>> template<typename Type, std::size_t tDimension>
>
> struct dimension<::raptor::Point<Type, tDimension>>
>
> : public boost::mpl::int_<tDimension> {
>
> // EMPTY
>
> };
>
>
>> template<typename Type, std::size_t tDimension, std::size_t tIndex>
>
> struct access<::raptor::Point<Type, tDimension>, tIndex> {
>
> static Type get(const ::raptor::Point<Type, tDimension>& p) {
>
> return p[tIndex];
>
> }
>
>
>> static void set(::raptor::Point<Type, tDimension>& p,
>
> const Type& value) {
>
> p[tIndex] = value;
>
> }
>
> };
>
>
>> }}} // namespace boost::geometry::traits
>
>
>> #endif // RAPTOR_POINT_HPP_INCLUDED_
>
>
A real simple main.cpp:

> #include "Point.hpp"
>
>
>> int main() {
>
> raptor::Polygon<raptor::SphericalPoint> pl;
>
> raptor::PolySet<raptor::SphericalPoint> set;
>
> return sizeof(pl) + sizeof(set);
>
> }
>
>
>
GCC compilation error: g++ main.cpp -std=c++14

> In file included from /usr/include/boost/geometry/core/access.hpp:20:0,

                 from Point.hpp:5,

                 from main.cpp:1:

/usr/include/boost/geometry/core/point_type.hpp: In instantiation of
> 'struct boost::geometry::traits::point_type<raptor::Point<double> >':

/usr/include/boost/geometry/core/point_type.hpp:66:17: required from
> 'struct boost::geometry::core_dispatch::point_type<void,
> raptor::Point<double> >'

/usr/include/boost/geometry/core/coordinate_type.hpp:58:62: required from
> 'struct boost::geometry::core_dispatch::coordinate_type<void,
> raptor::Point<double> >'

/usr/include/boost/geometry/core/coordinate_type.hpp:92:25: required from
> 'struct boost::geometry::coordinate_type<raptor::Point<double> >'

/usr/include/boost/geometry/geometries/concepts/point_concept.hpp:90:54:
> required from 'class boost::geometry::concept::Point<raptor::Point<double>
> >'

/usr/include/boost/concept/detail/has_constraints.hpp:32:62: required by
> substitution of 'template<class Model> boost::concepts::detail::yes
> boost::concepts::detail::has_constraints_(Model*,
> boost::concepts::detail::wrap_constraints<Model, (& Model:: constraints)>*)
> [with Model = boost::geometry::concept::Point<raptor::Point<double> >]'

/usr/include/boost/concept/detail/has_constraints.hpp:42:5: required from
> 'const bool
> boost::concepts::not_satisfied<boost::geometry::concept::Point<raptor::Point<double>
> > >::value'

/usr/include/boost/concept/detail/has_constraints.hpp:45:31: required
> from 'struct
> boost::concepts::not_satisfied<boost::geometry::concept::Point<raptor::Point<double>
> > >'

/usr/include/boost/mpl/if.hpp:67:11: required from 'struct
> boost::mpl::if_<boost::concepts::not_satisfied<boost::geometry::concept::Point<raptor::Point<double>
> > >,
> boost::concepts::constraint<boost::geometry::concept::Point<raptor::Point<double>
> > >, boost::concepts::requirement<boost::concepts::failed************
> boost::geometry::concept::Point<raptor::Point<double> >::************> >'

/usr/include/boost/concept/detail/general.hpp:50:8: required from 'struct
> boost::concepts::requirement_<void
> (*)(boost::geometry::concept::Point<raptor::Point<double> >)>'

/usr/include/boost/geometry/geometries/ring.hpp:60:5: required from
> 'class boost::geometry::model::polygon<raptor::Point<double>, true, true,
> std::vector, std::vector, std::allocator, std::allocator>'

main.cpp:4:42: required from here

/usr/include/boost/geometry/core/point_type.hpp:45:5: error: no matching
> function for call to 'assertion_failed(mpl_::failed************
> (boost::geometry::traits::point_type<raptor::Point<double>
> >::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE::************)(mpl_::assert_::types<raptor::Point<double>,
> mpl_::na, mpl_::na, mpl_::na>))'

     BOOST_MPL_ASSERT_MSG

     ^

/usr/include/boost/mpl/assert.hpp:82:5: note: candidate: template<bool C>
> int mpl_::assertion_failed(typename mpl_::assert<C>::type)

 int assertion_failed( typename assert<C>::type );

     ^

/usr/include/boost/mpl/assert.hpp:82:5: note: template argument
> deduction/substitution failed:

/usr/include/boost/geometry/core/point_type.hpp:45:5: note: cannot
> convert
> 'boost::geometry::traits::point_type<Geometry>::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE48::assert_arg<raptor::Point<double>
> >()' (type 'mpl_::failed************
> (boost::geometry::traits::point_type<raptor::Point<double>
> >::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE::************)(mpl_::assert_::types<raptor::Point<double>,
> mpl_::na, mpl_::na, mpl_::na>)') to type 'mpl_::assert<false>::type {aka
> mpl_::assert<false>}'

     BOOST_MPL_ASSERT_MSG

     ^

In file included from
> /usr/include/boost/geometry/core/coordinate_type.hpp:21:0,

                 from /usr/include/boost/geometry/core/access.hpp:24,

                 from Point.hpp:5,

                 from main.cpp:1:

/usr/include/boost/geometry/core/point_type.hpp: In instantiation of
> 'struct boost::geometry::core_dispatch::point_type<void,
> raptor::Point<double> >':

/usr/include/boost/geometry/core/coordinate_type.hpp:58:62: required from
> 'struct boost::geometry::core_dispatch::coordinate_type<void,
> raptor::Point<double> >'

/usr/include/boost/geometry/core/coordinate_type.hpp:92:25: required from
> 'struct boost::geometry::coordinate_type<raptor::Point<double> >'

/usr/include/boost/geometry/geometries/concepts/point_concept.hpp:90:54:
> required from 'class boost::geometry::concept::Point<raptor::Point<double>
> >'

/usr/include/boost/concept/detail/has_constraints.hpp:32:62: required by
> substitution of 'template<class Model> boost::concepts::detail::yes
> boost::concepts::detail::has_constraints_(Model*,
> boost::concepts::detail::wrap_constraints<Model, (& Model:: constraints)>*)
> [with Model = boost::geometry::concept::Point<raptor::Point<double> >]'

/usr/include/boost/concept/detail/has_constraints.hpp:42:5: required from
> 'const bool
> boost::concepts::not_satisfied<boost::geometry::concept::Point<raptor::Point<double>
> > >::value'

/usr/include/boost/concept/detail/has_constraints.hpp:45:31: required
> from 'struct
> boost::concepts::not_satisfied<boost::geometry::concept::Point<raptor::Point<double>
> > >'

/usr/include/boost/mpl/if.hpp:67:11: required from 'struct
> boost::mpl::if_<boost::concepts::not_satisfied<boost::geometry::concept::Point<raptor::Point<double>
> > >,
> boost::concepts::constraint<boost::geometry::concept::Point<raptor::Point<double>
> > >, boost::concepts::requirement<boost::concepts::failed************
> boost::geometry::concept::Point<raptor::Point<double> >::************> >'

/usr/include/boost/concept/detail/general.hpp:50:8: required from 'struct
> boost::concepts::requirement_<void
> (*)(boost::geometry::concept::Point<raptor::Point<double> >)>'

/usr/include/boost/geometry/geometries/ring.hpp:60:5: required from
> 'class boost::geometry::model::polygon<raptor::Point<double>, true, true,
> std::vector, std::vector, std::allocator, std::allocator>'

main.cpp:4:42: required from here

/usr/include/boost/geometry/core/point_type.hpp:66:17: error: no type named
> 'type' in 'struct boost::geometry::traits::point_type<raptor::Point<double>
> >'

>::type type;

                 ^

In file included from
> /usr/include/boost/geometry/geometries/polygon.hpp:26:0,

                 from Point.hpp:10,

                 from main.cpp:1:

/usr/include/boost/geometry/geometries/concepts/point_concept.hpp: In
> instantiation of 'class
> boost::geometry::concept::Point<raptor::Point<double> >':

/usr/include/boost/concept/detail/has_constraints.hpp:32:62: required by
> substitution of 'template<class Model> boost::concepts::detail::yes
> boost::concepts::detail::has_constraints_(Model*,
> boost::concepts::detail::wrap_constraints<Model, (& Model:: constraints)>*)
> [with Model = boost::geometry::concept::Point<raptor::Point<double> >]'

/usr/include/boost/concept/detail/has_constraints.hpp:42:5: required from
> 'const bool
> boost::concepts::not_satisfied<boost::geometry::concept::Point<raptor::Point<double>
> > >::value'

/usr/include/boost/concept/detail/has_constraints.hpp:45:31: required
> from 'struct
> boost::concepts::not_satisfied<boost::geometry::concept::Point<raptor::Point<double>
> > >'

/usr/include/boost/mpl/if.hpp:67:11: required from 'struct
> boost::mpl::if_<boost::concepts::not_satisfied<boost::geometry::concept::Point<raptor::Point<double>
> > >,
> boost::concepts::constraint<boost::geometry::concept::Point<raptor::Point<double>
> > >, boost::concepts::requirement<boost::concepts::failed************
> boost::geometry::concept::Point<raptor::Point<double> >::************> >'

/usr/include/boost/concept/detail/general.hpp:50:8: required from 'struct
> boost::concepts::requirement_<void
> (*)(boost::geometry::concept::Point<raptor::Point<double> >)>'

/usr/include/boost/geometry/geometries/ring.hpp:60:5: required from
> 'class boost::geometry::model::polygon<raptor::Point<double>, true, true,
> std::vector, std::vector, std::allocator, std::allocator>'

main.cpp:4:42: required from here

/usr/include/boost/geometry/geometries/concepts/point_concept.hpp:93:10:
> error: 'value' is not a member of
> 'boost::geometry::dimension<raptor::Point<double> >'

     enum { ccount = dimension<Geometry>::value };

          ^

Where is the problem ? or it's a GCC bug ?

Thanks



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net