Question

J'ai une classe de base abstraite qui contient une implémentation imbriquée privée. c ++ visuel me donne l'erreur suivante lorsque je tente d'instancier la mise en œuvre imbriquée non abstraite:

C2259 d'erreur: 'nœud :: empty_node': ne peut pas instancier classe abstraite (ligne 32)

pour autant que je peux dire, j'ai surchargé tous les membres abstraits de la classe de base

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() 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;
    }
};
Était-ce utile?

La solution

Les signatures de fonction ne correspondent pas. Les fonctions membres virtuelles pures dans la classe de base « nœud » ne sont pas const; les fonctions de la classe dérivée « empty_node » sont const.

Vous devez soit faire les fonctions virtuelles classe de base const ou supprimer le qualificatif const des fonctions membres de la classe dérivée.

Autres conseils

Votre classe imbriquée manque une version non-const de key, value, left, right, add, méthodes de remove et search.

Vos fonctions ne sont pas const Dérogations.

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