Domanda

Le scrivo un immutabile albero binario di ricerca in C ++. Miei nodi di terminazione sono rappresentati da un nodo vuoto singoletto. Il mio compilatore (Visual C ++) sembra essere difficoltà a risolvere il membro statico protetto che detiene il mio Singleton. Ottengo il seguente errore:

errore LNK2001: simbolo esterno "protetta: classe boost statico :: shared_ptr> nodo :: m_empty"??? (M_empty @ $ node @ HH @@ 1V $ shared_ptr @ V @ $ node HH @@@ spinta? @@ A)

Sto presupponendo questo significa che cant risolvere il membro m_empty statico per il nodo tipo. È corretto? Se sì, come posso risolvere il problema?

Codice segue:

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 radice del mio albero viene inizializzato come:

shared_ptr<node<int,int>> root = node<int,int>::empty();
È stato utile?

Soluzione

m_empty è statico e quindi è necessario avere una fonte (cpp) file con qualcosa come il seguente:

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

Nota: La mia risposta originale non era corretta e non ha tenuto conto che si trattava di un modello. Questa è la risposta che ha dato AndreyT nella sua risposta; Ho aggiornato questa risposta con la risposta corretta, perché questa è la risposta accettata e appare nella parte superiore della pagina. Si prega di upvote risposta di AndreyT, non questo.

Altri suggerimenti

Come altri hanno detto, è necessario fornire un punto di definizione per il vostro membro statico. Tuttavia, dal momento che è un membro di un template, la sintassi sta per essere un po 'più complessa, allora quello che è stato suggerito in precedenza. Se non mi manca nulla, dovrebbe apparire come segue

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

È inoltre possibile fornire un inizializzatore (o inizializzatori) in questa dichiarazione, se necessario.

È necessario inizializzare la variabile m_empty nel file cpp.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top