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

member hook implementation for splay_multiset in Boost::Intrusive

本文关键字:成员 实现 Intrusive splay Boost multiset      更新时间:2023-10-16

我在visual C++2008上的一个项目中实现了boost::interactive,但我偶然发现了一个问题。我正在为splaymultiset容器使用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:projectssampleprojectsample.cpp(21) : error C2327: 'MyClass::memberSplayHook' : is not a type name, static, or enumerator
1>d:projectssampleprojectsample.cpp(21) : error C2065: 'memberSplayHook' : undeclared identifier
1>d:projectssampleprojectsample.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

同时,当选项2被启用(选项1被注释掉)时,我不会看到未声明的标识符错误消息,因为这些错误与选项1一起出现。但我确实看到了下面这样的错误(很明显)。

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

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

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

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

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

编辑:不要从字面上理解标题——这同样适用于Visual C++2010和2012。我的所有会员挂钩都使用这种变通方法;在某个时候,我甚至可能试图了解它的作用,或者更重要的是,如何以更低的成本将它打包到一个更舒适的设置中"我需要找到这个变通方法的以前实现,这样我就可以复制和修改它"。。。