在boost r树中存储原始指针的问题
Issue storing raw pointers in boost R-tree
当试图从r-tree中删除值时,我得到编译错误。我还将一个原始指针与盒子一起存储,这似乎导致了问题-如果我存储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);
^
完整的代码示例可以在Colliru上找到。我使用gcc 4.9.3和boost 1.62(与boost 1.61相同的错误)。
我有同样的问题,我找到另一种方式走动:
重新定义一个equal_to函子(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;
}
在GCC 6.2.1, boost 1.61.0(也在GCC 4.9.3和boost 1.58.0)
灵感来自这张票
最后为原始指针创建了一个包装器:
struct wrapData {
public:
wrapData(Data *data) { _data = data; }
operator Data*() const { return _data; }
private:
Data *_data;
};
typedef std::pair<box_t, wrapData> value_t;
相关文章:
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- 为包含原始指针的对象C++智能指针
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 将原始指针传递给接受unique_ptr作为参数的函数
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 更改保留指向其字段的原始指针的对象地址
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 如何在C++代码中灵活使用和替换标准::shared_ptr或标准::unique_ptr或原始指针?