Frage

Ich schreibe einen unveränderlichen binären Suchbaum in C ++. Meine Endknoten werden von einem Singleton leeren Knoten dargestellt. Mein Compiler (Visual C ++) scheint Probleme zu haben Lösung des geschützten statischen Element, das meine Singleton hält. Ich erhalte die folgende Fehlermeldung:

Fehler LNK2001: extern Symbol??? "Geschützt: statische Klasse boost :: shared_ptr> node :: m_empty" (m_empty @ $ Knoten @ HH @@ 1V $ Shared_ptr @ V $ node @ HH @@@ boost @@ A)

Ich gehe davon aus bedeutet dies, es kann nicht das statische m_empty Mitglied für den Typen Knoten lösen. Ist das richtig? Wenn ja, wie kann ich es beheben?

-Code folgt:

using namespace boost;
template<typename K, typename V>
class node {
protected:
    class empty_node : public node<K,V> {
    public:
        bool is_empty(){ return true; }
        const shared_ptr<K> key() { throw cant_access_key; }
        const shared_ptr<V> value()  { throw cant_access_value; }
        const shared_ptr<node<K,V>> left()  { throw cant_access_child; }
        const shared_ptr<node<K,V>> right()  { throw cant_access_child; }
        const shared_ptr<node<K,V>> add(const shared_ptr<K> &key, const shared_ptr<V> &value){
            return shared_ptr<node<K,V>>();
        }
        const shared_ptr<node<K,V>> remove(const shared_ptr<K> &key) { throw cant_remove; }
        const shared_ptr<node<K,V>> search(const shared_ptr<K> &key) { return shared_ptr<node<K,V>>(this); }
    };

    static shared_ptr<node<K,V>> m_empty;
public:
    virtual bool is_empty() = 0;
    virtual const shared_ptr<K> key() = 0;
    virtual const shared_ptr<V> value() = 0;
    virtual const shared_ptr<node<K,V>> left() = 0;
    virtual const shared_ptr<node<K,V>> right() = 0;
    virtual const shared_ptr<node<K,V>> add(const shared_ptr<K> &key, const shared_ptr<V> &value) = 0;
    virtual const shared_ptr<node<K,V>> remove(const shared_ptr<K> &key) = 0;
    virtual const shared_ptr<node<K,V>> search(const shared_ptr<K> &key) = 0;


    static shared_ptr<node<K,V>> empty() {
        if(m_empty.get() == NULL){
            m_empty.reset(new empty_node());
        }
        return m_empty;
    }
};

die Wurzel meines Baumes wird initialisiert, wie:

shared_ptr<node<int,int>> root = node<int,int>::empty();
War es hilfreich?

Lösung

m_empty ist statisch und so haben Sie brauchen, um eine Quelle (CPP) Datei mit etwas wie folgt aus:

template <typename K, typename V> shared_ptr<node<K,V> > node<K,V>::m_empty;

Hinweis: Meine ursprüngliche Antwort war falsch und habe nicht berücksichtigt, dass dies eine Vorlage war. Dies ist die Antwort, die AndreyT in seiner Antwort gab; Ich habe diese Antwort mit der richtigen Antwort aktualisiert, da dies die akzeptierte Antwort ist und erscheint am oberen Rand der Seite. Bitte upvote AndreyT Antwort, nicht diese.

Andere Tipps

Wie bereits gesagt, müssen Sie einen Definitionspunkt für Ihr statisches Element bereitzustellen. Da es jedoch ein Mitglied einer Vorlage ist, wird die Syntax geht ein wenig komplexer sein, was dann vor vorgeschlagen wurde. Wenn ich nicht etwas fehlt, sollte es wie folgt aussehen

template<typename K, typename V> shared_ptr<node<K,V> > node<K,V>::m_empty;

Sie können auch einen Initialisierer (oder initializers) in dieser Erklärung zur Verfügung stellen, falls erforderlich.

Sie müssen die m_empty Variable in Ihrer CPP-Datei initialisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top