我正在尝试重新绑定我的自定义分配器类型MyAllocator<foo>
,以便在basic_string
类中使用,例如:
std::basic_string<char, std::char_traits<char>, MyAllocator<char>> ...
分配器作为MyAllocator<void>
传递给上下文,所以我需要重新绑定分配器。
在std::allocator_traits
,http://en.cppreference.com/w/cpp/memory/allocator_traits:
成员别名模板:
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
答案 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>
如果Alloc
是Alloc<U, Args>
形式的类模板实例,其中Args
是零个或多个类型参数;否则,rebind_alloc
的实例化是不正确的。
同意cppreference。它(分配器特征)似乎已经在C ++ 11中添加,因此它不会出现在n3376中。进一步的考古学可以发现它到达的地方,但这并不是所有相关的。
在这方面,似乎您的编译器不是兼容的C ++ 11编译器。
通过小修补程序,n1905将编译您的代码而不会出错。
如果您无法更改编译器,那么唯一合理的响应就是实现一个简单的rebind
。