我目前正在尝试使用自定义分配器。我有一个small application实现了一个带内存池的自定义分配器。
它适用于std::vector
但是当我使用std::set
尝试时,我收到运行时错误:
typedef std::set<Data, std::less<Data>, my_allocator<Data> > PoolSet;
Pool<Data> pool(1024);
PoolSet set;
set.insert(Data()); // error: no pool found for type: std::_Rb_tree_node<Data>
问题是std :: set使用我的分配器来处理数据和数据节点。由于没有为数据节点注册池,因此代码将失败。
详细信息可在code。
中找到有谁知道我该做些什么来解决这个问题?
答案 0 :(得分:1)
这是@BenVoigt提到的rebind
。
http://en.wikipedia.org/wiki/Allocator_(C++)
分配人员必须提供 模板类成员
template <typename U> struct A::rebind { typedef A<U> other; };
,它启用 获得相关的可能性 分配器,以a为参数进行参数化 不同的类型。例如,给定一个 分配器类型IntAllocator
类型int
的对象,相关的 类型对象的分配器类型 可以使用long
获得IntAllocator::rebind<long>::other
。