我正在尝试将Howard Hinnant的 stack_alloc
与boost rtrees结合使用,如以下示例所示:
#include "stack_alloc.h"
#include <boost/geometry/index/rtree.hpp>
using NodePoint = boost::geometry::model::point<double, 2, boost::geometry::cs::cartesian>;
using Linear = boost::geometry::index::linear<8, 2>;
using RTree =
boost::geometry::index::rtree<NodePoint, Linear, boost::geometry::index::indexable<NodePoint>,
boost::geometry::index::equal_to<NodePoint>,
stack_alloc<NodePoint, 100>>;
int main()
{
RTree my_tree{};
return 0;
}
这无法使用相当大的模板错误堆栈进行编译。我认为问题的核心是:
这是coliru上的完整示例,带有完整错误。
这是怎么了
我尝试将
stack_alloc
与各种boost集合一起使用,例如boost::container::static_vector
和boost::container::map
,并且效果很好。我还尝试使用了this SO reply的另一个
stack_allocator
实现,并得到了相同的错误。此外,我知道Howard Hinnant有一个更新的实现,即
short_alloc
。我尝试使用它,但是此实现没有默认的ctor,要求我们在构建时提供存储。由于boost
将分配器作为模板参数并在内部实例化它,因此我无法找到一种使这项工作有效的方法,但是如果有办法,它将很乐意使用它。 stack_alloc
和/vs short_alloc
的更多信息:1,2,3 最佳答案
问题的核心本质上是循环依赖。
构造RTree
会导致rtree<...>
模板实例化,其中包括typedef node_pointer = allocators_type::node_pointer
,它会触发allocators_type
的实例化,即detail::rtree::allocators<...>
,它具有detail::rtree::node_alloc<...>
的基类,在其定义中将分配器重新绑定(bind)到节点类型。节点类型是detail::rtree::variant_leaf<...>
和detail::rtree::variant_internal_node<...>
的变体。
但是stack_alloc
需要sizeof(T)
,因此variant
类型中包含的两个模板都将被实例化,并且在实例化variant_internal_node
时,它需要Allocators::node_pointer
,因此必须实例化Allocators
,但这不是我们在实例化过程中的目的!
我建议尝试short_alloc
并将分配器传递给容器。因为它将存储与分配器类型分开,所以它不要求模板类型完整无缺。
关于c++ - Hinnant的带有Boost Rtrees : compilation failure的堆栈分配器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57368793/