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

时间:2012-08-02 08:40:39

标签: c++ visual-c++ boost intrusive-containers

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

#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,在代码中提及),在这两种情况下我都会看到编译错误。

当启用Option-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 个答案:

答案 0 :(得分:1)

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

我手头没有VS来检查确切的错误信息所以我可能错了(但是阅读'成员钩子'和'Visual C ++'总是触发'有问题'模式),但是请尝试检查一下:

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

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