Boost::Intrusive中splay_multiset的成员钩子实现
member hook implementation for splay_multiset in Boost::Intrusive
我在visual C++2008上的一个项目中实现了boost::interactive,但我偶然发现了一个问题。我正在为splaymultiset容器使用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:projectssampleprojectsample.cpp(21) : error C2327: 'MyClass::memberSplayHook' : is not a type name, static, or enumerator
1>d:projectssampleprojectsample.cpp(21) : error C2065: 'memberSplayHook' : undeclared identifier
1>d:projectssampleprojectsample.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:projectssampleprojectsample.cpp(25) : error C2146: syntax error : missing ';' before identifier 'mmset'
1>d:projectssampleprojectsample.cpp(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
我的问题是为什么我在第一种情况下会出错?我该怎么办才能通过这个问题?
Boost成员钩子(总是?)被破坏,因为它们不是用Visual C++编译的。
我手头没有VS来检查准确的错误消息,所以我可能错了(但读取"成员挂钩"answers"Visual C++"总是触发"有问题"模式),但请尝试检查:
http://permalink.gmane.org/gmane.comp.lib.boost.user/56875
编辑:不要从字面上理解标题——这同样适用于Visual C++2010和2012。我的所有会员挂钩都使用这种变通方法;在某个时候,我甚至可能试图了解它的作用,或者更重要的是,如何以更低的成本将它打包到一个更舒适的设置中"我需要找到这个变通方法的以前实现,这样我就可以复制和修改它"。。。
相关文章:
- 三向比较运算符成员与非成员实现
- 多次实现成员功能
- 可以具有不同基成员实现的类的最佳实现
- 如何为非常量和常量重载实现一次成员函数?
- 基于自定义void_t实现的成员检测
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- C++ 20 中的运算符 == 和 <=> 应该作为成员还是自由函数实现?
- 如何为具有私有成员的派生类实现移动构造函数
- 在C++中实现类似 python "map"函数的问题:调用类成员函数
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- C++ 入门 12.1:我可以在类中使用静态向量成员实现 StrBlob<string> 吗?
- 使用 PIMPL 惯用法,实现是否应始终是类的私有成员?
- 如何将已实现的虚拟成员函数作为参数传递
- std::add_pointer 非静态成员函数的实现
- 为什么在std::optional的某些实现中有一个虚拟工会成员?
- 成员功能C 的不同实现
- 在.cpp文件中实现时访问私有成员
- 是否可以使用抛出交换成员实现?
- 如何在cpp文件中为多个类型创建模板类成员实现?
- 用int成员实现哪些操作符