2012-03-27 3 views
0

私は現在、boostライブラリの使い方を勉強しようとしており、boost :: intrusive :: splay_set(またはその問題ではsplaytree)の問題を見つけました。boost :: intrusive :: splay_setのポインタ

カテゴリクラス(カテゴリ*)へのポインタを保持するスプレイツリーがあるとします。私は次のように書こうとしています

splay_set<Category*, compare<std::greater<Category*>>> CategoriesSplay 

悲しいかな、うまくいきません。私はそれが100を超えているので、Visual Studioがコンパイルプロセスを終了しているので、生成しているエラーを書きません。

は、その後、私は私のCategoryクラスは

class Category : public splay_set_base_hook<link_mode<auto_unlink>, Category*> 

ここでも、ここでは運に拡張する必要があるクラスを変更しようとしました。 2番目のコードのCategory *をvoid_pointer(Category)に変更することもできません。悲しいことに、ドキュメントを増強することは、侵入型スプレイセットへのポインタを追加する助けにはならない。

誰かに私の問題の解決策がありますか?前もって感謝します。

+0

エラーは何ですか? (少なくとも最初の数人です。) – Adrian

+0

実際には、どのように拡張クラステンプレートを定義するかによって異なります。上記のように定義されている場合、私のエラーは次のようになります: 'エラーC2825: '次へ':' :: 'エラーが続くときにクラスまたは名前空間でなければなりません。C2903:' pack ':シンボルはクラステンプレートでも関数テンプレートでもない 'しかし、それが残っていればポインタエラーを定義するのは 'エラーC2825です: 'T':' :: ''エラーが続くときにクラスまたは名前空間でなければなりませんC2039:' default_splay_set_hook ':'グローバル名前空間 'のメンバーではありません' –

答えて

0

2つのこと:

まず、あなたが実際のオブジェクトを格納する必要があり、あなたのオブジェクトへのポインタを保存しないでください。だからあなたの宣言は次のようになります。

splay_set<Category, compare<std::greater<Category>>> CategoriesSplay 

第二には、あなたは、コンテナがその作業を行う必要がある、あなたのクラスのデータメンバを実装する必要があります。最も簡単な方法は、単にベース「フック」クラスから継承することで、そのような:

class Category : public splay_set_base_hook<> { 
... 

は覚えておいてください:侵入コンテナは、その含まれているのメモリはSTLコンテナのやり方オブジェクト管理していません。 のオブジェクトは、の前にコンテナに挿入する必要があります。オブジェクトを削除するときに削除してください。

関連する問題