0

ビジュアル 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

私の質問は、なぜ最初のケースでエラーが発生するのですか? この問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

ブースト メンバー フックは、Visual C++ でコンパイルされないため、(常に?) 壊れています。

正確なエラー メッセージを確認するための VS が手元にないため、間違っている可能性があります (ただし、「メンバー フック」と「Visual C++」を読み取ると、常に「問題があります」モードがトリガーされます)、これを確認してみてください。 :

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

編集: 見出しを文字通りに解釈しないでください。Visual C++ 2010 および 2012 にも同じことが当てはまります。私のメンバー フックはすべて、この回避策を使用しています。ある時点で、それが何をするのか、またはもっと重要なことに、「この回避策の以前の実装を見つけて、コピーして変更できるようにする必要がある」よりも少ない費用で、より快適なセットアップにパッケージ化する方法を理解しようとすることさえあるかもしれません。 ..

于 2012-08-02T12:21:48.960 に答える