2012-03-27 21 views
0

我目前正在尝试学习如何使用boost库,我偶然发现了boost :: intrusive :: splay_set(或splaytree在这个问题)的问题。指针在boost :: intrusive :: splay_set

让我们假设我想要保留指向Category类的指针树(所以Category *)。我想写以下

splay_set<Category*, compare<std::greater<Category*>>> CategoriesSplay 

可悲的是,这是行不通的。我不会写出它产生的错误,因为它超过了100,并且Visual Studio正在终止编译过程。

然后我试图改变我的类别班应该在这里再次延伸到

class Category : public splay_set_base_hook<link_mode<auto_unlink>, Category*> 

,没有运气类。将第二个代码中的Category *更改为v​​oid_pointer(Category)也不起作用。令人遗憾的是,增加文档无助于添加指向侵入式展示集的指针。

有没有人得到一些解决我的问题?提前致谢。

+0

有什么错误? (至少在前几个) – Adrian 2012-03-27 13:19:19

+0

它实际上取决于我如何定义扩展类模板。如果它的定义如上,我的错误是:'错误C2825:'下一个':必须是一个类或命名空间后跟'::'''错误C2903:'pack':符号既不是类模板也不是函数模板'但是,如果它没有定义指针错误,就会出现'error C2825:'T':必须是一个类或名称空间,后跟'::'''错误C2039:'default_splay_set_hook':不是'全局名称空间'的成员' – 2012-03-27 13:21:41

回答

0

两件事:

首先,你不应该存储一个指向你的对象的指针,你应该存储实际的对象。所以你的声明应该是这样的:

splay_set<Category, compare<std::greater<Category>>> CategoriesSplay 

其次,你需要在你的类中实现容器需要完成它的工作的数据成员。最简单的方法是刚刚从基地“挂钩”类继承,像这样:

class Category : public splay_set_base_hook<> { 
... 

记住:介入式容器不管理及其包含的内存中对象的STL容器做的方式。您需要在之前分配您的对象,然后将其插入容器中,并确保在删除它时将其删除。