The _Alloc
template is used to obtain objects of some type. The container may have an internal need to allocate objects of a different type. For example, when you have a std::list<T, A>
, the allocator A
is meant to allocate objects of type T
but the std::list<T, A>
actually needs to allocate objects of some node type. Calling the node type _Ty
, the std::list<T, A>
needs to get hold of an allocator for _Ty
objects which is using the allocation mechanism provided by A
. Using
typename _A::template rebind<_Ty>::other
specifies the corresponding type. Now, there are a few syntactic annoyances in this declaration:
- Since
rebind
is a member template of _A
and _A
is a template argument, the rebind
becomes a dependent name. To indicate that a dependent name is a template, it needs to be prefixed by template
. Without the template
keyword the <
would be considered to be the less-than operator.
- The name
other
also depends on a template argument, i.e., it is also a dependent name. To indicate that a dependent name is a type, the typename
keyword is needed.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…