这个过程需要处理两个不同的allocator,其中一个是通过对另一个的重绑定而获得的。它对几乎所有程序都工作得很好,即使是将allocator用于相当复杂的目的的程序。它所不能完成的是向allocator提供一些不寻常的指针类型。它明显依赖于能使用list_node<t> *类型的普通指针。
如果你极端野心勃勃,想将其它可能的指针类型传给allocator,一切都突然变得复杂多了--从一个节点指向另一个节点的指针不再是list_node<t> *或void *了,但它必须是能够从allocator获取的某个类型。直接实现是不太可能的:用一个不完全的类型实例化allocator是非法的,因此,除非list_node已经被完整定义,否则无法谈论指向list_node的指针。我们需要一个精巧的申明顺序。
template <class t, class pointer>
struct list_node
{
t val;
pointer next;
};
template <class t, class alloc>
class list : private alloc
{
private:
typedef typename alloc::template rebind<void>::other
void_alloc;
typedef typename void_alloc::pointer voidptr;
typedef typename list_node<t, voidptr> node;
typedef typename alloc::template rebind<node>::other
node_alloc;
typedef typename node_alloc::pointer nodeptr;