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 的赋值?