لماذا أحصل على خارجيات لم تحل؟
-
20-09-2019 - |
سؤال
أنا أكتب شجرة بحث ثنائية ثابتة في 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 الخاص بك.