【发布时间】:2015-11-12 17:18:09
【问题描述】:
我尝试编写一个自定义的 STL 风格的容器。为了简单起见,假设它是一个列表。我查找了定义此类容器的标准方法:
template <typename T, typename A = std::allocator<T> > class mylist;
现在,我想使用嵌套类来管理列表的节点:
(inside mylist)
class node {
T data;
node *next;
}
据我了解,我不需要在 node 的定义前面放置 template 说明符,因为编译器将为 mylist 的模板参数的每个组合实例化单独的类 mylist<T,A>::node。
但是,现在我不仅需要为T 类型的数据本身分配内存,还需要为它们的包装器node 分配内存。因此,我希望默认模板参数的类型为std::allocator<mylist<T>::node>。不过,此时mylist 还没有被声明,编译器的不安是可以理解的:
error: `mylist' was not declared in this scope
如何解决这个难题?有两个限制:
- 通常,我会在不完全声明其内容的情况下声明缺失的类。但是,由于它嵌套在我要声明的内容中,所以这不是一个选项。
- 我需要嵌套
node,因为它需要访问mylist的分配器实例。例如,我在node上声明了operator=,其中很多内存管理都是递归发生的。这对于列表来说可能是多余的,您可以在mylist中执行此操作,从而消除node对A的参数依赖性,但这对于我正在实现的数据结构至关重要。
【问题讨论】:
-
看看g++是如何实现
std::list的可能值得一看。 -
看分配器
rebind
标签: c++ templates stl containers