【发布时间】:2011-12-07 15:59:43
【问题描述】:
我已经在这个问题上玩弄了太多时间了。我正在尝试对节点和它们指向的类型使用两个不同的分配器来实现单个链表。以下代码一直在抱怨我在 SingleListNode 定义中部分专门化了朋友类声明:
namespace containers {
template<typename T, typename TAlloc,
typename NAlloc>class SingleList; // forward declaration
template<typename T, typename TAlloc = std::allocator<T>>
class SingleListNode {
template<typename T1, typename T2, typename T3>
friend class SingleList<T1, T2, T3> ; // partially specialized???
// class definition
};
template<typename T, typename TAlloc = std::allocator<T>,
typename NAlloc = std::allocator<SingleListNode<T>>>
class SingleList {
// class definition
};
} // end of namespace containers
一直告诉我:
../src/singlelist.h:21:16: 错误:“模板结构容器::SingleList”的特化必须出现在命名空间范围内 ../src/singlelist.h:21:39: 错误:部分特化“containers::SingleList”声明为“朋友”
据我所知,这不是专业。也许这是 GCC 编译器中的错误?不然我哪里错了?
【问题讨论】:
-
出于好奇,为什么节点需要知道它所属的列表?
-
@Nim:你认为为什么会这样?
friend声明允许列表访问节点,而不是相反。 -
我要指出的是,“数据”通常是通过副本保存在节点中的,而不是通过指针保存的,因为这在存储方面效率更高,并且在缓存方面表现更好(嗯,效率与链表可以是...);这是
std::list行为。您是否有特定的原因要将节点的分配与数据本身的分配分开? -
@MikeSeymour,doh,愚蠢的评论,没有正确查看代码,无论如何,似乎这将允许任何列表类型访问特定节点类型的内部(?)
-
@MatthieuM。我需要更多地练习容器等。认为最好的方法是自己建造它们,在下降的路上撞门。使用两个分配器构建一个容器类,这是一个很好的迷你项目。它可能有一天会派上用场。可能不会。