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;
    }
};
È stato utile?

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.

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