C++ 在boost R树中存储原始指针的问题

C++ 在boost R树中存储原始指针的问题,c++,boost,boost-geometry,C++,Boost,Boost Geometry,我在尝试从r树中删除值时遇到编译错误。我还将原始指针与框一起存储,这似乎是导致问题的原因-如果我存储int、string或shared_ptr,则不会出现错误 我没有选择切换到shared_ptr,因为所有这些都来自遗留库。还有其他解决办法吗 我对树的定义如下: namespace bg = boost::geometry; namespace bgi = boost::geometry::index; namespace bgm = boost::geometry::model; typed

我在尝试从r树中删除值时遇到编译错误。我还将原始指针与框一起存储,这似乎是导致问题的原因-如果我存储int、string或shared_ptr,则不会出现错误

我没有选择切换到shared_ptr,因为所有这些都来自遗留库。还有其他解决办法吗

我对树的定义如下:

namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
namespace bgm = boost::geometry::model;

typedef boost::geometry::model::point<float, 2, bg::cs::cartesian> point_t;
typedef boost::geometry::model::box<point_t> box_t;
typedef std::pair<box_t, Data*> value_t;

boost::geometry::index::rtree<value_t, boost::geometry::index::quadratic<16>> rtree;
while(!rtree.empty()) {
   auto it = rtree.begin();
   auto value = *it;
   rtree.remove(value); // <-- this is where the error appears.
}
...../boost/geometry/index/equal_to.hpp:127:60: error: ambiguous class template instantiation for 'struct boost::geometry::index::detail::equals<NdsInstance*, void>'
         && detail::equals<T2>::apply(l.second, r.second);
                                                        ^
...../boost/geometry/index/equal_to.hpp:28:8: error: candidates are: struct boost::geometry::index::detail::equals<Geometry*, Tag>
struct equals<Geometry *, Tag>
       ^
...../boost/geometry/index/equal_to.hpp:37:8: error:                 struct boost::geometry::index::detail::equals<T, void>
struct equals<T, void> 
       ^
...../boost/geometry/index/equal_to.hpp:127:60: error: incomplete type 'boost::geometry::index::detail::equals<NdsInstance*, void>' used in nested name specifier
         && detail::equals<T2>::apply(l.second, r.second);
                                                        ^
namespace bg=boost::geometry;
名称空间bgi=boost::geometry::index;
名称空间bgm=boost::geometry::model;
typedef boost::geometry::model::point\t;
typedef boost::geometry::model::box\t;
typedef std::对值\u t;
boost::geometry::index::rtree-rtree;
失败的代码如下所示:

namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
namespace bgm = boost::geometry::model;

typedef boost::geometry::model::point<float, 2, bg::cs::cartesian> point_t;
typedef boost::geometry::model::box<point_t> box_t;
typedef std::pair<box_t, Data*> value_t;

boost::geometry::index::rtree<value_t, boost::geometry::index::quadratic<16>> rtree;
while(!rtree.empty()) {
   auto it = rtree.begin();
   auto value = *it;
   rtree.remove(value); // <-- this is where the error appears.
}
...../boost/geometry/index/equal_to.hpp:127:60: error: ambiguous class template instantiation for 'struct boost::geometry::index::detail::equals<NdsInstance*, void>'
         && detail::equals<T2>::apply(l.second, r.second);
                                                        ^
...../boost/geometry/index/equal_to.hpp:28:8: error: candidates are: struct boost::geometry::index::detail::equals<Geometry*, Tag>
struct equals<Geometry *, Tag>
       ^
...../boost/geometry/index/equal_to.hpp:37:8: error:                 struct boost::geometry::index::detail::equals<T, void>
struct equals<T, void> 
       ^
...../boost/geometry/index/equal_to.hpp:127:60: error: incomplete type 'boost::geometry::index::detail::equals<NdsInstance*, void>' used in nested name specifier
         && detail::equals<T2>::apply(l.second, r.second);
                                                        ^
while(!rtree.empty()){
auto it=rtree.begin();
自动值=*它;

rtree.remove(value);//我最终为原始指针创建了一个包装器:

struct wrapData {
    public:
    wrapData(Data *data) { _data = data; }
    operator Data*() const { return _data; }
    private:
    Data *_data;
};

typedef std::pair<box_t, wrapData> value_t;
struct wrapData{
公众:
wrapData(Data*Data){u Data=Data;}
运算符数据*()常量{return_Data;}
私人:
数据*\u数据;
};
typedef std::对值\u t;

我也遇到了同样的问题,我找到了另一种方法:

重新定义等于函子(rtree的第四个模板参数)

示例代码:

#include <boost/geometry.hpp>

namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
namespace bgm = boost::geometry::model;

using point = bgm::point<double, 2, bg::cs::spherical_equatorial<bg::degree>>;
using value_type = std::pair<point, int*>;

struct my_equal { 
    using result_type = bool; 
    bool operator() (value_type const& v1, value_type const& v2) const { 
        return bg::equals(v1.first, v2.first) && v1.second == v2.second;} 
}; 

using rtree = bgi::rtree<value_type, bgi::quadratic<16>, bgi::indexable<value_type>, my_equal>;

int main() {
    int a,b;
    rtree rtree;
    rtree.insert(std::make_pair(point(45,45), &a));
    rtree.insert(std::make_pair(point(45,45), &b));
    rtree.remove(std::make_pair(point(45,45), &b));

    return 0;
}
#包括
名称空间bg=boost::geometry;
名称空间bgi=boost::geometry::index;
名称空间bgm=boost::geometry::model;
使用point=bgm::point;
使用value_type=std::pair;
结构my_equal{
使用结果_type=bool;
布尔运算符()(值类型常量&v1,值类型常量&v2)常量{
返回bg::equals(v1.first,v2.first)和&v1.second==v2.second;}
}; 
使用rtree=bgi::rtree;
int main(){
INTA,b;
rtree-rtree;
rtree.insert(标准::制作成对(点(45,45),&a));
rtree.insert(标准::形成成对(点(45,45),&b));
rtree.移除(标准::形成配对(点(45,45),&b));
返回0;
}
使用gcc 6.2.1、boost 1.61.0(也使用gcc 4.9.3和boost 1.58.0)


启发,我更喜欢您的解决方案而不是我的解决方案,它使访问数据变得更干净。