2014-07-19 40 views
1

我试图使用boost::geometry::index::rtree但我得到以下错误left of'.select_on_container_copy_construction' must have class/struct/union/ inside file has_member_function_callable_with.hppc + +的boost ::几何::指数:: .select_on_container_copy_construction的RTREE左边必须有类/结构/联合

这里是我的代码:

class A; 

typedef boost::intrusive_ptr<A> SharedA; 
typedef boost::geometry::model::box<Vector2f> Box2D; 

namespace boost { 
    namespace geometry { 
     namespace traits { 
      template<typename _Scalar, int _Cols> 
      struct tag<Vector<_Scalar, _Cols> > 
      { 
       typedef point_tag type; 
      }; 

      template<typename _Scalar, int _Cols> 
      struct coordinate_type<Vector<_Scalar, _Cols> > 
      { 
       typedef _Scalar type; 
      }; 

      template<typename _Scalar, int _Cols> 
      struct coordinate_system<Vector<_Scalar, _Cols> > 
      { 
       typedef cs::cartesian type; 
      }; 

      template<typename _Scalar, int _Cols> 
      struct dimension<Vector<_Scalar, _Cols> > : boost::mpl::int_<_Cols>{}; 

      template<typename _Scalar, int _Cols, std::size_t Dimension> 
      struct access<Vector<_Scalar, _Cols>, Dimension> 
      { 
       static inline _Scalar get(Vector<_Scalar, _Cols> const &matrix) 
       { 
        return matrix[Dimension]; 
       } 

       static inline void set(Vector<_Scalar, _Cols> &matrix, _Scalar const &value) 
       { 
        matrix[Dimension] = value; 
       } 
      }; 
     } 
     namespace index { 

      // apparently necessary: 
      template <typename Box> 
      struct indexable< boost::intrusive_ptr<Box> > 
      { 
       typedef boost::intrusive_ptr<Box> V; 
       typedef Box2D const& result_type; 
       result_type operator()(V const& v) const { return v->getBox(); } 
      }; 

     } 
    } 
} 

class A { 
public: 
    Vector3f position; 
    float distance; 

    const Box2D& getBox() const { 
     Box2D box(Vector2f(position[0] - distance, position[1] - distance), Vector2f(position[0] + distance, position[1] + distance)); 
     return const_cast<Box2D&>(box); 
    } 
} 

class Tree { 
private: 
    boost::geometry::index::rtree<SharedA, boost::geometry::index::rstar<16, 4>> tree; 
} 

输出:

1> tree.cpp 
1>x\include\boost\intrusive\detail\has_member_function_callable_with.hpp(200): error C2228: left of '.select_on_container_copy_construction' must have class/struct/union 
1>   type is 'boost::move_detail::add_rvalue_reference<U>::type' 
1>   x\include\boost\intrusive\detail\has_member_function_callable_with.hpp(276) : see reference to class template instantiation 'boost::container::container_detail::has_member_function_callable_with_select_on_container_copy_construction_impl<Fun,true,>' being compiled 
1>   with 
1>   [ 
1>    Fun=std::allocator<boost::geometry::index::detail::rtree::dynamic_leaf<boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>> 
1>   ] 
1>   x\include\boost\container\allocator_traits.hpp(262) : see reference to class template instantiation 'boost::container::container_detail::has_member_function_callable_with_select_on_container_copy_construction<const Alloc,>' being compiled 
1>   with 
1>   [ 
1>    Alloc=std::allocator<boost::geometry::index::detail::rtree::dynamic_leaf<boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>> 
1>   ] 
1>   x\include\boost\geometry\index\detail\rtree\node\node_d_mem_dynamic.hpp(257) : see reference to class template instantiation 'boost::container::allocator_traits<AllocNode>' being compiled 
1>   with 
1>   [ 
1>    AllocNode=std::allocator<boost::geometry::index::detail::rtree::dynamic_leaf<boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>> 
1>   ] 
1>   x\include\boost\geometry\index\detail\rtree\node\node_d_mem_dynamic.hpp(320) : see reference to function template instantiation 'BaseNodePtr boost::geometry::index::detail::rtree::create_dynamic_node<BaseNodePtr,boost::geometry::index::detail::rtree::dynamic_leaf<Value,Parameters,Box,Allocators,boost::geometry::index::detail::rtree::node_d_mem_static_tag>>::apply<std::allocator<_Other>>(AllocNode &)' being compiled 
1>   with 
1>   [ 
1>    BaseNodePtr=boost::geometry::index::detail::rtree::dynamic_node<boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::node_d_mem_static_tag> * 
1> ,   Value=boost::intrusive_ptr<A> 
1> ,   Parameters=boost::geometry::index::rstar<16,4,4,32> 
1> ,   Box=boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>> 
1> ,   Allocators=boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag> 
1> ,   _Other=boost::geometry::index::detail::rtree::dynamic_leaf<boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::node_d_mem_static_tag> 
1> ,   AllocNode=std::allocator<boost::geometry::index::detail::rtree::dynamic_leaf<boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>> 
1>   ] 
1>   x\include\boost\geometry\index\detail\rtree\node\node_d_mem_dynamic.hpp(320) : see reference to function template instantiation 'BaseNodePtr boost::geometry::index::detail::rtree::create_dynamic_node<BaseNodePtr,boost::geometry::index::detail::rtree::dynamic_leaf<Value,Parameters,Box,Allocators,boost::geometry::index::detail::rtree::node_d_mem_static_tag>>::apply<std::allocator<_Other>>(AllocNode &)' being compiled 
1>   with 
1>   [ 
1>    BaseNodePtr=boost::geometry::index::detail::rtree::dynamic_node<boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::node_d_mem_static_tag> * 
1> ,   Value=boost::intrusive_ptr<A> 
1> ,   Parameters=boost::geometry::index::rstar<16,4,4,32> 
1> ,   Box=boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>> 
1> ,   Allocators=boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag> 
1> ,   _Other=boost::geometry::index::detail::rtree::dynamic_leaf<boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::node_d_mem_static_tag> 
1> ,   AllocNode=std::allocator<boost::geometry::index::detail::rtree::dynamic_leaf<boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>> 
1>   ] 
1>   x\include\boost\geometry\index\detail\rtree\node\node_d_mem_dynamic.hpp(316) : while compiling class template member function 'boost::geometry::index::detail::rtree::dynamic_node<Value,Parameters,Box,Allocators,boost::geometry::index::detail::rtree::node_d_mem_static_tag> *boost::geometry::index::detail::rtree::create_node<Allocators,boost::geometry::index::detail::rtree::dynamic_leaf<Value,Parameters,Box,Allocators,boost::geometry::index::detail::rtree::node_d_mem_static_tag>>::apply(Allocators &)' 
1>   with 
1>   [ 
1>    Value=boost::intrusive_ptr<A> 
1> ,   Parameters=boost::geometry::index::rstar<16,4,4,32> 
1> ,   Box=boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>> 
1> ,   Allocators=boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag> 
1>   ] 
1>   x\include\boost\geometry\index\rtree.hpp(1267) : see reference to function template instantiation 'boost::geometry::index::detail::rtree::dynamic_node<Value,Parameters,Box,Allocators,boost::geometry::index::detail::rtree::node_d_mem_static_tag> *boost::geometry::index::detail::rtree::create_node<Allocators,boost::geometry::index::detail::rtree::dynamic_leaf<Value,Parameters,Box,Allocators,boost::geometry::index::detail::rtree::node_d_mem_static_tag>>::apply(Allocators &)' being compiled 
1>   with 
1>   [ 
1>    Value=boost::intrusive_ptr<A> 
1> ,   Parameters=boost::geometry::index::rstar<16,4,4,32> 
1> ,   Box=boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>> 
1> ,   Allocators=boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag> 
1>   ] 
1>   x\include\boost\geometry\index\rtree.hpp(1267) : see reference to class template instantiation 'boost::geometry::index::detail::rtree::create_node<boost::geometry::index::detail::rtree::allocators<std::allocator<_Ty>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag>,boost::geometry::index::detail::rtree::dynamic_leaf<Value,Parameters,Box,Allocators,boost::geometry::index::detail::rtree::node_d_mem_static_tag>>' being compiled 
1>   with 
1>   [ 
1>    _Ty=SharedA 
1> ,   Value=boost::intrusive_ptr<A> 
1> ,   Parameters=boost::geometry::index::rstar<16,4,4,32> 
1> ,   Box=boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>> 
1> ,   Allocators=boost::geometry::index::detail::rtree::allocators<std::allocator<SharedA>,boost::intrusive_ptr<A>,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::model::box<boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>>,boost::geometry::index::detail::rtree::node_d_mem_static_tag> 
1>   ] 
1>   x\include\boost\geometry\index\rtree.hpp(1264) : while compiling class template member function 'void boost::geometry::index::rtree<SharedA,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::index::indexable<Value>,boost::geometry::index::equal_to<Value>,std::allocator<_Ty>>::raw_create(void)' 
1>   with 
1>   [ 
1>    Value=SharedA 
1> ,   _Ty=SharedA 
1>   ] 
1>   x\include\boost\geometry\index\rtree.hpp(544) : see reference to function template instantiation 'void boost::geometry::index::rtree<SharedA,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::index::indexable<Value>,boost::geometry::index::equal_to<Value>,std::allocator<_Ty>>::raw_create(void)' being compiled 
1>   with 
1>   [ 
1>    Value=SharedA 
1> ,   _Ty=SharedA 
1>   ] 
1>   x\src\tree.h(35) : see reference to class template instantiation 'boost::geometry::index::rtree<SharedA,boost::geometry::index::rstar<16,4,4,32>,boost::geometry::index::indexable<Value>,boost::geometry::index::equal_to<Value>,std::allocator<_Ty>>' being compiled 
1>   with 
1>   [ 
1>    Value=SharedA 
1> ,   _Ty=SharedA 
1>   ] 

我无法找到我做错了什么。

+0

什么是Vector2f/Vector? – sehe

+0

@sehe我自己的类 –

回答

3

看来这里是升级到1.55.0的bug,升级到1.56.0(仍然是beta)似乎解决了这个问题。

+0

是的,msvc-12(Visual Studio 2013)中的Boost 1.55(Boost.Intrusive中)存在一个错误,请参阅:https://svn.boost.org/trac/boost/ticket/ 9332。 –

相关问题