首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在boost R-tree中存储原始指针时出现问题

在boost R-tree中存储原始指针时出现问题
EN

Stack Overflow用户
提问于 2016-10-11 11:33:11
回答 2查看 405关注 0票数 2

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

我没有切换到shared_ptr的选项,因为所有这些都来自旧库。是否有其他解决方法?

我的树定义如下:

代码语言:javascript
复制
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;

失败的代码如下:

代码语言:javascript
复制
while(!rtree.empty()) {
   auto it = rtree.begin();
   auto value = *it;
   rtree.remove(value); // <-- this is where the error appears.
}

错误如下:

代码语言:javascript
复制
...../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);
                                                        ^

完整的代码示例可以在Colliru上找到。我使用的是gcc 4.9.3和boost 1.62 (和boost 1.61错误相同)。

EN

回答 2

Stack Overflow用户

发布于 2016-10-28 19:53:28

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

重新定义equal_to函数器(rtree的第四个模板参数)

示例代码:

代码语言:javascript
复制
#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;
}

在gcc 6.2.1,boost 1.61.0上工作(也在gcc 4.9.3和boost 1.58.0上)

灵感来自this ticket

票数 2
EN

Stack Overflow用户

发布于 2016-10-11 13:52:35

我最终为原始指针创建了一个包装器:

代码语言:javascript
复制
struct wrapData {
    public:
    wrapData(Data *data) { _data = data; }
    operator Data*() const { return _data; }
    private:
    Data *_data;
};

typedef std::pair<box_t, wrapData> value_t;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39970131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档