如果自定义分配器中不存在重绑定,std :: allocator_traits是否定义了rebind_alloc?

时间:2015-10-21 17:01:11

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

我正在尝试重新绑定我的自定义分配器类型MyAllocator<foo>,以便在basic_string类中使用,例如:

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

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

std::allocator_traitshttp://en.cppreference.com/w/cpp/memory/allocator_traits

的cppreference页面中
  

成员别名模板:

     

rebind_alloc<T>Alloc::rebind<T>::other如果存在,否则Alloc<T, Args>如果此Alloc为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

2 个答案:

答案 0 :(得分:5)

  

我正在使用gcc 4.8和C ++ 11。

然后你需要在你的分配器中定义Set<Share> shares; ,GCC&#39; rebind不支持C ++ 11分配器要求,直到版本5.1(然后只适用于新版本) ABI字符串,即basic_string)。

因此,您的分配器必须满足C ++ 03分配器要求,定义所有成员,因为std::__cxx::basic_string不是由4.8中的字符串使用

答案 1 :(得分:1)

kirasoft在[allocator.traits.types] / 10中说:

template <class T> using rebind_alloc = see below;
     

别名模板: Alloc::rebind<T>::other如果存在这样的类型;否则,Alloc<T, Args>如果AllocAlloc<U, Args>形式的类模板实例,其中Args是零个或多个类型参数;否则,rebind_alloc的实例化是不正确的。

同意cppreference。它(分配器特征)似乎已经在C ++ 11中添加,因此它不会出现在n3376中。进一步的考古学可以发现它到达的地方,但这并不是所有相关的。

在这方面,似乎您的编译器不是兼容的C ++ 11编译器。

通过小修补程序,n1905将编译您的代码而不会出错。

如果您无法更改编译器,那么唯一合理的响应就是实现一个简单的rebind