2009-10-10 2 views
0

Я пишу неизменяемое двоичное дерево поиска в C++. Мое завершающие узлы представлены одиночным пустым узлом. Мой компилятор (visual C++), похоже, имеет проблемы с решением защищенного статического члена, который поддерживает мой singleton. Я получаю следующее сообщение об ошибке:Почему я получаю нерешенные внешние?

ошибка LNK2001: неразрешенный внешний символ "protected: static class boost :: shared_ptr> node :: m_empty" (? M_empty @? $ Node @ HH @@ 1V? $ Shared_ptr @ V? $ node @ HH @@@ boost @@ A)

Я предполагаю, что это означает, что он не может разрешить статический член m_empty для узла типа. Это верно? Если да, то как мне это исправить?

код следующим образом:

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() { throw cant_access_key; } 
     const shared_ptr<V> value() { throw cant_access_value; } 
     const shared_ptr<node<K,V>> left() { throw cant_access_child; } 
     const shared_ptr<node<K,V>> right() { throw cant_access_child; } 
     const shared_ptr<node<K,V>> add(const shared_ptr<K> &key, const shared_ptr<V> &value){ 
      return shared_ptr<node<K,V>>(); 
     } 
     const shared_ptr<node<K,V>> remove(const shared_ptr<K> &key) { throw cant_remove; } 
     const shared_ptr<node<K,V>> search(const shared_ptr<K> &key) { 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(m_empty.get() == NULL){ 
      m_empty.reset(new empty_node()); 
     } 
     return m_empty; 
    } 
}; 

корень моего дерева инициализируется как:

shared_ptr<node<int,int>> root = node<int,int>::empty(); 

ответ

5

m_empty является статическим, и поэтому вы должны будете иметь источник (CPP-файл) с чем-то например:

template <typename K, typename V> shared_ptr<node<K,V> > node<K,V>::m_empty; 

Примечание: Мой первоначальный ответ был индр ect и не учитывали, что это шаблон. Это ответ, который Андрей дал в своем ответе; Я правильно ответил на этот ответ, потому что это принятый ответ и появляется в верхней части страницы. Пожалуйста, поддержите ответ AndreyT, а не этот.

0

Вам необходимо инициализировать переменную m_empty в вашем .cpp-файле.

7

Как уже было сказано, вам необходимо указать точку определения для вашего статического члена. Однако, поскольку он является элементом шаблона, синтаксис будет немного более сложным, чем предполагалось ранее. Если я ничего не хватает, он должен выглядеть следующим образом

template<typename K, typename V> shared_ptr<node<K,V> > node<K,V>::m_empty; 

Вы также можете предоставить инициализатор (или инициализаторами) в этой декларации, в случае необходимости.

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