سؤال

أنا أكتب شجرة بحث ثنائية ثابتة في C ++. يتم تمثيل العقد الخاصة بي بعقدة مفرغة مفردة. يبدو أن المترجم الخاص بي (Visual C ++) يواجه مشكلة في حل العضو الثابت المحمي الذي يحمل المفرد الخاص بي. أحصل على الخطأ التالية:

خطأ LNK2001: الرمز الخارجي غير المحلول "محمي: static class boost :: shared_ptr> node :: m_empty" (؟ m_empty@؟ $ node@hhh@1v؟ $ shared_ptr@v؟ $ node@hh@rost )

أفترض أن هذا يعني أنه لا يمكن حل عضو 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;

يمكنك أيضًا توفير مُهيئ (أو مُهيئات) في هذا الإعلان ، إذا لزم الأمر.

تحتاج إلى تهيئة متغير m_empty في ملف .cpp الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top