Я получаю ошибки компиляции при попытке удалить значение из r-дерева. Я также храню необработанный указатель вместе с полем, который, кажется, вызывает проблему - я не получаю ошибку, если я храню int, string или shared_ptr.Проблема с хранением необработанных указателей в буфере R-дерева
У меня нет возможности переключиться на 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);
^
Full код образца можно найти на Colliru. Я использую gcc 4.9.3 и повышаю 1.62 (такая же ошибка с повышением 1.61).
Мне нравится ваше решение лучше, чем у меня, это делает его намного чище, чтобы получить доступ обратно данные. –