【问题标题】:Hinnant's stack allocator with boost rtrees: compilation failureHinnant 的带有 boost rtrees 的堆栈分配器:编译失败
【发布时间】:2019-12-13 13:54:12
【问题描述】:

我正在尝试将 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;
}

由于相当大的模板错误堆栈无法编译。我认为问题的核心是:

/usr/local/include/boost/geometry/index/detail/rtree/node/variant_static.hpp:26:7:错误:无效使用不完整类型'class boost::geometry::index::detail: :rtree::allocators, 100>, boost::geometry::model::point, boost::geometry::index::linear, boost::geometry::model::box >, boost: :geometry::index::detail::rtree::node_variant_static_tag>'

这是coliru 上的完整示例,其中包含完整错误。

这里有什么问题?

我尝试将stack_alloc 与各种提升集合一起使用,例如boost::container::static_vectorboost::container::map,并且效果很好。 我还尝试使用来自this SO reply 的另一个stack_allocator 实现并得到同样的错误。

此外,我知道 Howard Hinnant 有一个更新的实现,即short_alloc。我试过使用它,但是这个实现没有默认的ctor,需要我们在构建时提供存储。由于boost 将分配器作为模板参数并在内部对其进行实例化,因此我找不到使其工作的方法,但如果有方法,我会很乐意使用它。 stack_alloc 和/vs short_alloc 的更多信息:123

【问题讨论】:

标签: c++ c++11 boost memory-management allocator


【解决方案1】:

问题的核心本质上是循环依赖。

构造RTree 会导致rtree&lt;...&gt; 模板实例化,其中包含一个typedef node_pointer = allocators_type::node_pointer,它会触发allocators_type 的实例化,即detail::rtree::allocators&lt;...&gt;,它有一个基类detail::rtree::node_alloc&lt;...&gt;,在它的定义将分配器重新绑定到节点类型。节点类型是detail::rtree::variant_leaf&lt;...&gt;detail::rtree::variant_internal_node&lt;...&gt; 的变体。

但是stack_alloc需要sizeof(T),所以variant类型中包含的两个模板都会被实例化,而在实例化variant_internal_node时,它需要Allocators::node_pointer,所以Allocators必须被实例化,但不是'这就是我们正在实例化的过程!

我建议尝试short_alloc 并将分配器传递给容器。因为它把存储和分配器类型分开了,所以它不应该要求模板类型的完整性,打破循环。

【讨论】:

  • 是的,循环依赖是/是问题。我试图用here 和转发声明之类的技巧来解决它,但无济于事。使用short_alloc 和我之前错过的构造函数可以找到一个可行的解决方案!无论如何,这可能会更好,因为short_alloc 是一致的,而stack_alloc 不是(1)。谢谢!
猜你喜欢
  • 2013-02-15
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2014-12-31
  • 2018-04-10
  • 2011-02-11
  • 1970-01-01
相关资源
最近更新 更多