c – 如果自定义分配器中没有重新绑定,std :: allocator_traits是否定义了rebind_alloc?

前端之家收集整理的这篇文章主要介绍了c – 如果自定义分配器中没有重新绑定,std :: allocator_traits是否定义了rebind_alloc?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试重新绑定我的自定义分配器类型MyAllocator< foo>,以便在basic_string类中使用,例如:

std :: basic_string< char,std :: char_traits< char&gt ;,MyAllocator< char>> …

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

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

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,但没有定义重新绑定结构(这似乎不是实现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并在自定义分配器中实现重新绑定,还是使用allocator_traits有正确的方法

我使用gcc 4.8和C 11. 14目前不是一个选项.

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

解决方法

I am using gcc 4.8 with C++11.

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

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

猜你在找的C&C++相关文章