У меня есть абстрактный базовый класс, который содержит частную вложенную реализацию. 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;
}
};
, пожалуйста, подумайте об изменении названия. Класс _is_ virtual, вопрос в том, почему он рассматривается как абстрактный. – Bahbar
Btw, вы можете видеть, какие методы компилятор думает, оставлены без реализации в окне вывода (View -> Output). В окне «Ошибка» отображается только первая строка многострочных ошибок, окно «Вывод» показывает более подробную информацию – sbk