gpt4 book ai didi

c++ - 如果自定义分配器中不存在重新绑定(bind),std::allocator_traits 是否定义 rebind_alloc?

转载 作者:可可西里 更新时间:2023-11-01 18:35:37 25 4
gpt4 key购买 nike

我正在尝试重新绑定(bind)我的自定义分配器类型,MyAllocator<foo> , 用于 basic_string类,例如:

std::basic_string<char, std::char_traits<char>, MyAllocator<char>> ...

分配器作为 MyAllocator<void> 传递给上下文,所以我需要重新绑定(bind)分配器。

来自 std::allocator_traits 的 cppreference 页面, http://en.cppreference.com/w/cpp/memory/allocator_traits :

Member alias templates:

rebind_alloc<T>: Alloc::rebind<T>::other if present, otherwise Alloc<T, Args> if this Alloc is Alloc<U, Args>

我的自定义分配器实现 allocator_traits ,但没有定义重新绑定(bind)结构(这似乎不是实现 allocator_traits 的要求)。我对文档的理解是它 allocator_traits应该懂rebind_alloc .但是,如果我尝试调用 rebind_alloc在我的自定义分配器类型上:

template<typename T>
using RebindAlloc =
typename std::allocator_traits<MyAllocator<void>>::template rebind_alloc<T>;

当我尝试传递 RebindAlloc<char> 时遇到各种编译器错误到 basic_string输入:

In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/string:52:
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/basic_string.h:114:41: error:
'rebind' following the 'template' keyword does not refer to a template
typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;

显然文档误导了我。我应该放弃 rebind_alloc 吗?并在自定义分配器中实现重新绑定(bind),或者是否有使用 allocator_traits 执行此操作的正确方法? ?

我正在使用带有 C++11 的 gcc 4.8。 14 目前不是一个选项。

这是我正在尝试做的代码片段: https://gist.github.com/jacquelinekay/0cee73d1d2d78d8edd31

最佳答案

I am using gcc 4.8 with C++11.

然后你需要在你的分配器中定义rebind,GCC的basic_string在5.1版本之前不支持C++11分配器要求(然后只支持新的ABI 字符串,即 std::__cxx::basic_string).

因此您的分配器必须满足 C++03 分配器要求,定义所有成员,因为 allocator_traits 在 4.8 中未被字符串使用

关于c++ - 如果自定义分配器中不存在重新绑定(bind),std::allocator_traits 是否定义 rebind_alloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33265165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com