自定义分配器兼容性

时间:2017-06-30 10:53:58

标签: c++ c++11 templates vector allocator

给出以下函数签名

void foo(std::vector<int> &bar);

和自定义分配器CustomAlloc,使用std::vector<int, CustomAlloc>实例调用foo会导致

could not convert ‘bar’ from ‘std::vector<int, CustomAlloc<int, [...] >}’ to ‘std::vector<int>’

我不是C ++模板大师,如果我错了,请纠正我,但我的理解是std::vector<int>默认为std::vector<int, std::allocator<int> >(gcc 7.1.1.-3),因此定义了一个完全不相关的类型。

这个说法我试图找到一些使用foo使std::vector<int, CustomAlloc>可调用的解决方案,并附带以下内容。

template<typename Allocator>
void foo(std::vector<int, Allocator> &bar);

我不喜欢分配器规范如何传播模板,但我想这就是STL的工作原理。

所以我的问题是,如果foo专门针对int进行操作,您将如何解决此问题?

PS:为糟糕的头衔道歉我无法找到一个好的头衔

1 个答案:

答案 0 :(得分:2)

标准中有一个全新的命名空间来解决这个问题 - namespace pmr。见polymorphic_allocator: when and why should I use it?

关于如何避免在没有pmr解决方案的情况下使用模板传播此问题。答案是你不能,你需要硬指定allocator参数,或者你需要模板向量来接受任何类型的分配器。