ビジュアル C++ 2008 で自分のプロジェクトの 1 つに boost::intrusive を実装していたところ、問題が発生しました。splay_multiset コンテナーに splay フックを使用しています。MyClass の下でスプレイ フックをパブリックに定義しました (以下のコード)。
#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
私の質問は、なぜ最初のケースでエラーが発生するのですか? この問題を解決するにはどうすればよいですか?