문제

C ++에서 불변의 이진 검색 트리를 쓰고 있습니다. 내 종료 노드는 싱글 톤 빈 노드로 표시됩니다. 내 컴파일러 (Visual C ++)는 싱글 톤을 보유하는 보호 된 정적 멤버를 해결하는 데 어려움이있는 것 같습니다. 다음 오류가 발생합니다.

오류 LNK2001 : 해결되지 않은 외부 기호 "보호 : 정적 클래스 부스트 :: shared_ptr> node :: m_empty"(? )

이것이 유형 노드의 정적 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();
도움이 되었습니까?

해결책

m_empty 정적이므로 다음과 같은 소스 (.CPP) 파일이 필요합니다.

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

참고 : 내 원래 대답이 잘못되었으며 이것이 템플릿이라는 것을 고려하지 않았습니다. 이것은 Andreyt가 그의 대답으로 준 답입니다. 이 답변을 정답으로 업데이트했습니다. 이것은 허용 된 답변이며 페이지 상단에 나타납니다. 안드레이트의 대답을 발표하십시오.

다른 팁

다른 사람들이 말했듯이, 당신은 정적 멤버에게 정의 지점을 제공해야합니다. 그러나 템플릿의 구성원이기 때문에 구문은 이전에 제안 된 것보다 조금 더 복잡 할 것입니다. 아무것도 놓치지 않으면 다음과 같이 보일 것입니다.

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

필요한 경우이 선언에서 이니셜 라이저 (또는 이니셜 라이저)를 제공 할 수도 있습니다.

.cpp 파일에서 m_empty 변수를 초기화해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top