Perché la mia classe nido essere visto come astratto?
-
20-09-2019 - |
Domanda
Ho una classe astratta di base che contiene un'implementazione privata nidificato. Visual C ++ mi sta dando il seguente errore quando provo ad un'istanza non astratta nidificato implementazione:
Errore C2259: 'nodo :: empty_node': non creare un'istanza di classe astratta (linea 32)
per quanto posso dire, ho sovrascritto tutti i membri astratti della classe base
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() const { throw empty_node_exception; }
const shared_ptr<V> value() const { throw empty_node_exception; }
const shared_ptr<node<K,V>> left() const { throw empty_node_exception; }
const shared_ptr<node<K,V>> right() const { throw empty_node_exception; }
const shared_ptr<node<K,V>> add(const shared_ptr<K> &key, const shared_ptr<V> &value) const {
return shared_ptr<node<K,V>>();
}
const shared_ptr<node<K,V>> remove(const shared_ptr<K> &key) const { throw empty_node_exception; }
const shared_ptr<node<K,V>> search(const shared_ptr<K> &key) const { 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(NULL == m_empty.get()){
m_empty.reset(new empty_node());
}
return m_empty;
}
};
Soluzione
Le firme di funzione non corrispondono. Le funzioni membro virtuali pure nella 'nodo' classe di base non sono const; le funzioni del 'empty_node' classe derivata sono const.
Si sia bisogno di fare la classe di base funzioni virtuali const o rimuovere il qualificatore const dalle funzioni membro nella classe derivata.
Altri suggerimenti
La classe annidata manca un versioni non-const di metodi key
, value
, left
, right
, add
, remove
e search
.
Le funzioni const
non sono sostituzioni.