Boost::Intrusive 中 splay_multiset 的成员钩子实现

Posted

技术标签:

【中文标题】Boost::Intrusive 中 splay_multiset 的成员钩子实现【英文标题】:member hook implementation for splay_multiset in Boost::Intrusive 【发布时间】:2012-08-02 08:40:39 【问题描述】:

我在 Visual C++ 2008 上为我的一个项目实施 boost::intrusive,我偶然发现了一个问题。我正在为 splay_multiset 容器使用 splay 钩子。我已经在 MyClass(下面的代码)下公开定义了 splay 钩子。

#include <boost/intrusive/unordered_set.hpp>
#include <boost/intrusive/splay_set.hpp>
#include <iostream>

using namespace boost::intrusive;

class MyClass 
              
   int int_;

   public:

   MyClass(int i)
      :  int_(i)
   

   splay_set_member_hook<link_mode<normal_link> > memberSplayHook;

//**OPTION-1**
//PROBLEM CODE SEGMENT ++
//typedef member_hook<MyClass, splay_set_member_hook<link_mode<normal_link> >, &MyClass::memberSplayHook> MemberOption;       
//typedef splay_multiset<MyClass, MemberOption> MemberMultiSet; 
//PROBLEM CODE SEGMENT --

    MemberMultiSet mmset;
;

//**OPTION-2**
//WORKING CODE SEGMENT ++
typedef member_hook<MyClass, splay_set_member_hook<link_mode<normal_link> >, &MyClass::memberSplayHook> MemberOption;       
typedef splay_multiset<MyClass, MemberOption> MemberMultiSet; 
//WORKING CODE SEGMENT --


int main()

   return 0;

问题是,要使用 splay_multiset,无论我选择什么选项(选项 1 或 2,在代码中提到),在这两种情况下我都会看到编译错误。

启用选项 1 时(选项 2 已注释),我看到以下错误:

1>d:\projects\sampleproject\sample.cpp(21) : error C2327: 'MyClass::memberSplayHook' : is not a type name, static, or enumerator
1>d:\projects\sampleproject\sample.cpp(21) : error C2065: 'memberSplayHook' : undeclared identifier
1>d:\projects\sampleproject\sample.cpp(22) : error C3203: 'member_hook' : unspecialized class template can't be used as a template argument for template parameter 'O1', expected a real type

虽然启用 Option-2(选项 1 被注释掉)时,我没有看到未声明的标识符错误消息,因为这些错误与选项 1 一起出现。但我确实看到如下错误(很明显)。

1>d:\projects\sampleproject\sample.cpp(25) : error C2146: syntax error : missing ';' before identifier 'mmset'
1>d:\projects\sampleproject\sample.cpp(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

我的问题是为什么我在第一种情况下会出错?我该怎么做才能通过这个问题?

【问题讨论】:

【参考方案1】:

Boost 成员钩子(总是?)被破坏,因为它们不能用 Visual C++ 编译。

我手头没有 VS 来检查准确的错误消息,所以我可能是错的(但阅读“成员挂钩”和“Visual C++”总是会触发“有问题”模式),但请尝试检查这个:

http://permalink.gmane.org/gmane.comp.lib.boost.user/56875

编辑:不要从字面上理解标题——这同样适用于 Visual C++ 2010 和 2012。我所有的成员挂钩都使用这种解决方法;在某些时候,我什至可能会尝试了解它的作用,或者更重要的是,如何将其打包成更舒适的设置,以减少“我需要找到此解决方法的先前实现,以便我可以复制和修改它”。 ..

【讨论】:

嗯,我想这就是我的一个朋友从那里得到这个解决方法的链接。谢谢克里斯...

以上是关于Boost::Intrusive 中 splay_multiset 的成员钩子实现的主要内容,如果未能解决你的问题,请参考以下文章

没有调用构造函数的 boost::intrusive_ptr 的赋值?

[平衡树-Splay]文艺平衡树_区间翻转

模板_SPLAY

洛谷P3165 [CQOI2014]排序机械臂splay

BZOJ_1895_Pku3580 supermemo_Splay

_bzoj3223 Tyvj 1729 文艺平衡树Splay