我正在为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
我的问题是为什么我在第一种情况下收到错误?我该怎么办才能通过这个问题?
答案 0 :(得分:1)
Boost成员钩子(总是?)被破坏了,因为它们不能用Visual C ++编译。
我手头没有VS来检查确切的错误信息所以我可能错了(但是阅读'成员钩子'和'Visual C ++'总是触发'有问题'模式),但是请尝试检查一下:
http://permalink.gmane.org/gmane.comp.lib.boost.user/56875
编辑:不要直截了当地说标题 - 这同样适用于Visual C ++ 2010和2012.我的所有成员挂钩都使用此解决方法;在某些时候,我甚至可能会尝试理解它的作用,或者更重要的是,如何将其打包到更舒适的设置中以减少“我需要找到此解决方法的先前实现,以便我可以复制和修改它”。 ..