2009-10-10 3 views
0

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

ошибка C2259: «узел :: 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; 
    } 
}; 
+1

, пожалуйста, подумайте об изменении названия. Класс _is_ virtual, вопрос в том, почему он рассматривается как абстрактный. – Bahbar

+1

Btw, вы можете видеть, какие методы компилятор думает, оставлены без реализации в окне вывода (View -> Output). В окне «Ошибка» отображается только первая строка многострочных ошибок, окно «Вывод» показывает более подробную информацию – sbk

ответ

6

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

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

3

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

Функции const не являются переопределениями.

Смежные вопросы