我正在尝试编写一个派生自定义的STL分配器std::allocator
,但不知何故所有调用都要allocate()
转到基类.我把它缩小到这段代码:
templateclass a : public std::allocator { public: T* allocate(size_t n, const void* hint = 0) const { cout << "yo!"; return 0; } }; int main() { vector > v(1000, 42); return 0; }
我期待"哟!" 打印,然后是一些可怕的错误,因为我实际上没有分配任何东西.相反,该程序运行良好,并没有打印.我究竟做错了什么?
我在gcc和VS2008中得到了相同的结果.
您需要提供重新绑定成员模板以及C++标准中分配器要求中列出的其他内容.例如,您需要一个模板复制构造函数,它不仅可以接受allocator
,还可以接受allocator
.例如,一个代码可能会执行,例如std :: list可能会执行此操作
templatevoid alloc1chunk(Allocator const& alloc) { typename Allocator::template rebind< wrapper >::other ot(alloc); // ... }
如果没有正确的重新绑定模板,或者没有相应的复制构造函数,代码将失败.猜测要求是什么,你将无处可用.迟早你将不得不处理依赖于那些分配器要求的一部分的代码,并且代码将因为你的分配器违反它们而失败.我建议你在一些工作草案中看一下你的标准副本20.1.5
.