我应该如何使我的分配器重新绑定?我可以在保持其字段私有的同时做到这一点吗?

How am I supposed to make my allocator rebindable? Can I do it while keeping its fields private?

长话短说,问题来了:

template<class T>
struct alloc
{
    template<class U>
    alloc(alloc<U> const &other) : foo(other.foo) { }  // ERROR: other.foo is private 
    template<class U> struct rebind { typedef alloc<U> other; };
private:
    pool<T> *foo;  // do I HAVE to expose this?
};

公开私有字段是唯一的解决方案吗?
您实际上应该如何制作转换构造函数?

我自己的猜测是这是不可能的,您应该使用转换运算符:

template<class U>
operator alloc<U>() const { return alloc<U>(this->foo); }

但我希望有更好的答案...

在模板复制构造函数中,alloc<T>alloc<U>是不同的类型,意味着你不能在这里访问alloc<U>的私有成员。

您可以结交 alloc<U> 朋友:

template<class T>
struct alloc
{
    ... ...
    template <typename U>
    friend struct alloc;
    alloc(alloc<U> const &other) : foo(other.foo) {} // possible to access other.foo now
};