Perché mi ha risolto gli esterni?
-
20-09-2019 - |
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();
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.