Question

Je suis en train d'écrire un arbre de recherche binaire immuable dans c ++. Mes noeuds de terminaison sont représentés par un noeud vide singleton. Mon compilateur (Visual C ++) semble avoir des difficultés à résoudre l'organe statique protégé qui me tient singleton. Je reçois l'erreur suivante:

erreur LNK2001: symbole externe non résolu "protégé: coup de pouce de classe statique :: shared_ptr> :: node m_empty"?? (@ $ M_empty nœud @ HH @@ 1V $ shared_ptr @ V noeud $ @ HH @@@ boost? @@ A)

Je suppose que cela signifie qu'il ne peut pas résoudre le membre de m_empty statique pour le nœud de type. Est-ce correct? Si oui, comment puis-je résoudre ce problème?

Code suit:

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;
    }
};

la racine de mon arbre est initialisé comme:

shared_ptr<node<int,int>> root = node<int,int>::empty();
Était-ce utile?

La solution

m_empty est statique et donc vous aurez besoin d'avoir un fichier source (.cpp) avec quelque chose comme ce qui suit:

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

Note: Ma réponse originale était incorrecte et n'a pas tenu compte du fait que c'était un modèle. Ceci est la réponse que AndreyT a donné dans sa réponse; Je l'ai mis à jour cette réponse avec la bonne réponse parce que c'est la réponse acceptée et apparaît en haut de la page. S'il vous plaît upvote réponse de AndreyT, pas celui-ci.

Autres conseils

Comme d'autres ont dit, vous devez fournir un point de définition pour un membre statique. Cependant, étant donné qu'il est membre d'un modèle, la syntaxe va être un peu plus complexe alors ce qui a été suggéré auparavant. Si je ne manque rien, il devrait se présenter comme suit

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

Vous pouvez également fournir un initialiseur (ou initializers) dans cette déclaration, le cas échéant.

Vous devez initialiser la variable m_empty dans votre fichier .cpp.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top