【问题标题】:member hook implementation for splay_multiset in Boost::IntrusiveBoost::Intrusive 中 splay_multiset 的成员钩子实现
【发布时间】: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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嗯,我想这就是我的一个朋友从那里得到这个解决方法的链接。谢谢克里斯...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多