0

我在 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

同时,当启用选项 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

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

4

1 回答 1

1

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

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

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

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

于 2012-08-02T12:21:48.960 回答