なぜ私は、未解決の外部を取得していますか?
-
20-09-2019 - |
質問
私はC ++で不変のバイナリ検索ツリーを書いています。私の終端ノードがシングルトン空のノードによって表されます。私のコンパイラ(Visual C ++は)私のシングルトンを保持して保護された静的メンバを解決するトラブルを抱えているように見えます。私は次のエラーを取得する:
エラーLNK2001:未解決の外部シンボル "保護:静的クラスブースト:: shared_ptrの>ノード:: m_empty"???(m_empty @ $ノード@ HH @@ 1V $ shared_ptrのV @ $ノード@ HH @@@ブースト? @@ 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();
解決
m_empty
は静的でありますので、ソース(.CPP)以下のようなものを持つファイルを持っている必要があります:
template <typename K, typename V> shared_ptr<node<K,V> > node<K,V>::m_empty;
注:私のオリジナルの答えが間違っていましたし、これはテンプレートだったことを考慮していませんでした。これはAndreyTは彼の答えに与えた答えです。これが受け入れ答えで、ページの上部に表示されますので、私は、正しい答えを、この答えを更新しました。 AndreyTの答えではなく、これをupvoteしてください。の
他のヒント
、あなたはあなたの静的メンバの定義点を提供する必要があります。それはテンプレートのメンバーであるので、構文が前に提案されたもの、その後少し複雑になるだろう。私は何が不足していないよ場合は、次のように、それはなっているはずです。
template<typename K, typename V> shared_ptr<node<K,V> > node<K,V>::m_empty;
必要に応じてまた、この宣言に初期化子(または初期化子)を提供することができます。
あなたの.cppファイルにm_empty変数を初期化する必要があります。