2012-03-27 3 views
0

Ich versuche derzeit zu lernen, wie boost-Bibliothek zu verwenden, und ich bin auf ein Problem mit boost :: intrusive :: splay_set (oder splaytree in dieser Angelegenheit) gestolpert.Zeiger in boost :: intrusive :: splay_set

Angenommen, ich möchte einen Splay-Tree haben, der die Zeiger auf die Category-Klasse (also Category *) hält. Ich versuche zu schreiben

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

Leider funktioniert es nicht. Ich werde keine Fehler schreiben, die generiert werden, da es 100 überschreitet und Visual Studio den Kompilierungsprozess beendet.

Dann habe ich versucht Klasse zu ändern, die meine Kategorie Klasse

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

wieder erstrecken sollte, hier kein Glück. Das Ändern der Kategorie * im zweiten Code in void_pointer (Kategorie) funktioniert ebenfalls nicht. Leider hilft die Boost-Dokumentation nicht beim Hinzufügen von Zeigern zu aufdringlichen Splay-Sets.

Hat jemand eine Lösung für mein Problem? Danke im Voraus.

+0

Was sind die Fehler? (Zumindest die ersten paar.) – Adrian

+0

Es hängt tatsächlich davon ab, wie ich die Erweiterung Klassenvorlage definieren. Wenn es wie oben definiert ist, sind meine Fehler: 'Fehler C2825: 'Next': muss eine Klasse oder Namespace sein, gefolgt von '::'' 'Fehler C2903: 'pack': Symbol ist weder eine Klassenvorlage noch eine Funktionsvorlage Aber wenn es ohne Definition von Zeigerfehlern bleibt, ist 'Fehler C2825: 'T': muss eine Klasse oder ein Namespace sein, gefolgt von '::'' 'error C2039: 'default_play_set_hook': ist kein Mitglied von '' global namespace '' ' –

Antwort

0

Zwei Dinge:

Zunächst sollten Sie nicht einen Zeiger auf das Objekt speichern, müssen Sie das eigentliche Objekt speichern. So sollte Ihre Erklärung wie folgt aussehen:

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

Zweitens müssen Sie die Datenelemente in Ihrer Klasse implementieren, dass der Behälter seine Arbeit tun muss. Der einfachste Weg ist, einfach von der Basis „Haken“ Klasse erbt, etwa so:

class Category : public splay_set_base_hook<> { 
... 

Denken Sie daran: die aufdringlichen Container verwalten nicht die Erinnerung an ihrem enthaltenen Objekten, wie die STL-Container tun. Sie müssen Ihr Objekt vor zuweisen Sie es in den Container einfügen und stellen Sie sicher, dass Sie löschen, wenn Sie es entfernen.