0

テンプレートを使用して二分探索木を書いています。アイデアは、同じタイプのそれを継承する他のクラスと比較するために使用される仮想演算子オーバーロード関数を持つ純粋な抽象基本クラスがあるということです。このクラス、またはそれを継承する任意のクラスは、BST の「キー」を表します。

良い例は、最初にこれを使用して計画していることです。これは、シェーダー ソース (シェーダー ファイルから解析された文字列) を BST に値として追加することですShaderComparable。シェーダーであり、BST 内の主要な比較に使用されます。

問題は、コードを書いているときは問題なくコンパイルできるのに、メインに BST クラスのインスタンスを貼り付けて実行しようとするとすぐに、リンクの「未解決の外部」エラーが発生することです。

コード

SearchTree.hpp

#pragma once

#include <stdint.h>
#include "Comparable.hpp"

namespace esc
{ 
    /*
     * NOTE: K must inherit from type 'Comparable', located in "Comparable.hpp"
     */

    template < typename TComparable, typename TValue > 
    class SearchTree
    {
    public:
        class Iterator;
    private:
        struct Node;
        typedef typename Node TNode;
    public:
        SearchTree( void );
        ~SearchTree( void );
    public:
        //TValue find( const TComparable& k );
        //TValue find( int32_t index );
        //TValue find( const Iterator& pIter );

        //Iterator begin( void ) const;
        //Iterator end( void ) const;

        void insert( const TComparable& k, const TValue& v );
        //void insert( const Iterator& pIter );

        friend class Iterator;
    private:
        int32_t mNodeCount;
        TNode* mRoot;
    public:
        class Iterator 
        {
        public:
            Iterator( void );   
            inline TNode* operator->( void ) const 
            { return mCurrentNode; }
        private:
            ~Iterator( void );
            int32_t getNumStepsLeftToLeaf( void );
            int32_t getNumStepsRightToLeaf( void );
            void tallyDirectionalComparison( int& numLeftTrue, int& numRightTrue, const TComparable& k );
            void insertLeft( const TComparable& k, const TValue& v );
            void insertRight( const TComparable& k, const TValue& v );
            bool isLeafNode( const Node*& a );
            bool isInternalNode( const Node*& node );
        private:
            TNode* mCurrentNode;
            int32_t mIterPosition;
            friend class Node;
        };
    private:
        struct Node
        {
        public:
            int32_t index;
            TComparable Key;
            TValue Value;
        private:
            TNode* mParent;
            TNode* mLeftChild;
            TNode* mRightChild;
        };
    };
}

SearchTree.cpp

template < typename TComparable, typename TValue >
    SearchTree< TComparable, TValue >::SearchTree( void )
        : mRoot( NULL ),
          mPosition( 0 ), 
          mNodeCount( 0 )
    {}

    template < typename TComparable, typename TValue >
    SearchTree< TComparable, TValue >::~SearchTree( void )
    {
        //TODO
    }

ソースにはさらに多くのコードがありますが、あいまいさを避けるために、すべてを投稿したくありませんでした。イテレータの定義は通常、次のようなものです。

template < typename TComparable, typename TValue >
void SearchTree< TComparable, TValue >::Iterator::insertRight( const TComparable& k, const TValue& v )

エラー

1>Main.obj : error LNK2019: unresolved external symbol "public: __thiscall esc::SearchTree<class esc::ShaderComparable,struct esc::Shader>::~SearchTree<class esc::ShaderComparable,struct esc::Shader>(void)" (??1?$SearchTree@VShaderComparable@esc@@UShader@2@@esc@@QAE@XZ) referenced in function _main

1>Main.obj : error LNK2019: unresolved external symbol "public: __thiscall esc::SearchTree<class esc::ShaderComparable,struct esc::Shader>::SearchTree<class esc::ShaderComparable,struct esc::Shader>(void)" (??0?$SearchTree@VShaderComparable@esc@@UShader@2@@esc@@QAE@XZ) referenced in function _main

質問

これらのエラーが発生するのはなぜですか? これらを止めるにはどうすればよいですか?

4

2 に答える 2

0

デストラクタの一部を非公開にしたからだと思います。それらを公開してみてください。

于 2012-05-09T18:05:00.537 に答える
0

クラス テンプレート メンバー関数の本体は、.cpp ファイルではなく、ヘッダー (SearchTree.hpp) にある必要があります。これに関するスタック オーバーフローの正規の応答については、こちらを参照してください。

于 2012-05-09T22:44:45.263 に答える