错误背后的原因不是std::allocator<void>
专业化被删除。void
实际上,它作为带有参数的主模板仍然有效。该代码无法编译,因为::rebind
它不再是std::allocator
其自身的一部分。相反,实现应该使用 std::allocator_traits<Alloc>::rebind_alloc<U>
.
幸运的是,大多数容器通常允许将自定义分配器指定为模板参数。boost::bimap
根据docs ,分配器也是如此,其中分配器可以是第三、第四或第五个模板参数。它默认为std::allocator
,但boost::container::allocator
可以使用,这不会产生错误:
#include <boost/bimap.hpp>
#include <boost/container/allocator.hpp>
int main() {
boost::bimap<int, int, boost::container::allocator<int>> lookup;
}
此问题最近已在6fba6e5中得到修复。boost::bimap
现在可以正确检测嵌套::rebind
是否可用:
template<class A, class T, class = void>
struct allocator_rebind {
typedef typename detail::alloc_to<A, T>::type type;
};
template<class A, class T>
struct allocator_rebind<A, T,
typename detail::alloc_void<typename A::template rebind<T>::other>::type> {
typedef typename A::template rebind<T>::other type;
};