Почему мой класс гнезд выглядит абстрактным? - PullRequest
0 голосов
/ 10 октября 2009

У меня есть абстрактный базовый класс, который содержит частную вложенную реализацию. Visual C ++ выдает мне следующую ошибку, когда я пытаюсь создать экземпляр неабстрактной вложенной реализации:

ошибка C2259: 'node :: empty_node': невозможно создать экземпляр абстрактного класса (строка 32)

насколько я могу судить, я переопределил все абстрактные члены базового класса

Код следует:

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;
    }
};

Ответы [ 2 ]

6 голосов
/ 10 октября 2009

Сигнатуры функций не совпадают. Чистые виртуальные функции-члены в базовом классе 'node' не являются const; функции в производном классе empty_node являются постоянными.

Вам нужно либо сделать виртуальные функции базового класса const, либо удалить квалификатор const из функций-членов в производном классе.

3 голосов
/ 10 октября 2009

В вашем вложенном классе отсутствуют неконстантные версии key, value, left, right, add, remove и search.

Ваши const функции не переопределяются.

...