平凡的分配器感知容器
trivial allocator aware container?
我正在学习/玩分配器,试图理解它是如何工作的。但是我在尝试实现接受分配器的普通容器时遇到了问题。现在我以这样结束:
template<class T, class Allocator =std::allocator<T>> class Container {
public:
using allocator_type = Allocator;
using value_type = T;
using pointer = typename std::allocator_traits<allocator_type>::pointer;
using reference = value_type&;
using size_type = std::size_t;
Container( size_type n =0 , const allocator_type& allocator =allocator_type() ){
std::cout << "ctor" << std::endl;
allocator.allocate(n);
};
};
int main(int argc, const char* argv[]){
Container<int> c {5};
return 0;
}
它给我一个错误member function 'allocate' not viable: 'this' argument has type 'const allocator_type' (aka 'const std::__1::allocator<int>'), but function is not marked const
如何修复这个错误,请问?我错过什么了吗?我打算稍后再使用trait,但希望先使用旧的方式使其工作
你的台词
allocator.allocate(n);
尝试调用allocator
的allocate
方法,该方法未定义为const
方法。但是,如果您查看,allocator
的类型是const allocator_type&
,即对allocator_type
的const引用。
那你怎么用它呢?对于const对象(或对const对象的引用),通常可以做的一件事是从它构造一个不同的非const对象。例如,这将构建:
allocator_type(allocator).allocate(n);
正如SergeyA在评论中正确指出的那样,不构造临时的临时allocator_type
是相当常见的,而是创建这样一个成员:
allocator_type m_alloc; // Should probably be private
Container( size_type n =0 , const allocator_type& allocator =allocator_type() ) :
m_alloc{allocator}{
std::cout << "ctor" << std::endl;
m_alloc.allocate(n);
};
相关文章:
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 将 std::allocate_shared 与多态资源分配器一起使用
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 使用 std::分配器在 constexpr 中进行默认初始化
- 使用不兼容的分配器复制分配无序列图
- std::list 中的迭代器感知对象
- C++:矢量分配器行为、内存分配和智能指针
- 智能感知不适用于Visual Studio 2017中的cmake项目
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- 使用模板化分配器和对向量进行排序的函数
- C++ 中的分配器错误
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 通过引用传递向量是请求 std::分配器
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- 分配器感知的"std::array"样式容器?
- 在分配器感知类调用复制构造函数中对向量元素的引用
- 如何实现分配器感知的容器分配
- 平凡的分配器感知容器