0

次のようなC++ファイルがあります。



    //テキストのデバッグに使用
    #含む
    #含む
    //#含む
    #含む

    //stlには
    #含む
    #含む
    #含む



    //高速ノードメモリ管理に使用される高速固定サイズメモリアロケータ
    #include "fsa.h"

    //固定サイズのメモリアロケータを無効にして、パフォーマンスを比較できます
    // std newを使用し、オフにした場合は代わりに削除します
    #define USE_FSA_MEMORY 1

    //デバッグ情報に切り捨てられた行があるという警告を無効にします
    //stlヘッダーで発生します
    #pragma warning(disable:4786)

    //AStar検索クラス。UserStateは、ユーザーの状態空間タイプです。
    テンプレートクラスAStarSearch{

    公衆:
        // データ

        列挙型{
            SEARCH_STATE_NOT_INITIALISED、
            SEARCH_STATE_SEARCHING、
            SEARCH_STATE_SUCCEEDED、
            SEARCH_STATE_FAILED、
            SEARCH_STATE_OUT_OF_MEMORY、
            SEARCH_STATE_INVALID
        };

        //ノードは検索で可能な状態を表します
        //ユーザー指定の状態タイプはこのタイプに含まれます

    公衆:

        クラスノード{
        公衆:

            ノード*親; //検索中に後続ノードの親を記録するために使用されます
            ノード*子; //アプリケーションの検索後に使用され、検索を逆に表示します

            フロートg; //このノードのコスト+その前身(これまでのコスト)
            フロートh; //目標までの距離のヒューリスティック推定(ヒューリスティック推定)
            フロートf; //前任者と自己およびヒューリスティックの累積コストの合計(costSoFar +ヒューリスティック見積もり)。

            Node():
                    親(0)、子(0)、g(0.0f)、h(0.0f)、f(0.0f){
            }

             UserState m_UserState;
        };

        //ヒープをソートするには、STLに比較を可能にする比較関数が必要です
        //2つのノードのf値

        クラスHeapCompare_f{
        公衆:

            bool operator()(const Node * x、const Node * y)const {
                //ヒューリスティック推定の合計を比較します。
                x-> f>y->fを返します。
            }
        };

    公衆:
        //メソッド

        //コンストラクタはプライベートデータを初期化するだけです
        AStarSearch(int MaxNodes = 1000);

        //いつでも呼び出して検索をキャンセルし、すべてのメモリを解放します
        void CancelSearch();

        //開始状態と目標状態を設定します
        void SetStartAndGoalStates(UserState&Start、UserState&Goal);

        //検索を1ステップ進めます
        unsigned int SearchStep();

        //ユーザーはこれを呼び出して、後継者のリストに後継者を追加します
        //検索フロンティアを拡大する場合
        bool AddSuccessor(UserState&State);

        //ソリューションノードを解放します
        //これは、使用済みのすべてのノードメモリをクリーンアップするために行われます。
        // 探す
        void FreeSolutionNodes();

        //ソリューションをトラバースするための関数

        //開始ノードを取得します
        UserState * GetSolutionStart();

        //次のノードを取得します
        UserState * GetSolutionNext();

        //エンドノードを取得します
        UserState * GetSolutionEnd();

        //ソリューションイテレータを逆方向にステップします
        UserState * GetSolutionPrev();

        //教育目的での使用とデバッグには、表示できると便利です
        //各ステップでのオープンリストとクローズドリスト。これを可能にする2つの関数があります。

        UserState * GetOpenListStart();

        UserState * GetOpenListStart(float&f、float&g、float&h);

        UserState * GetOpenListNext();

        UserState * GetOpenListNext(float&f、float&g、float&h);

        UserState * GetClosedListStart();

        UserState * GetClosedListStart(float&f、float&g、float&h);

        UserState * GetClosedListNext();

        UserState * GetClosedListNext(float&f、float&g、float&h);

        //ステップ数を取得します

        int GetStepCount();

        voidEnsureMemoryFreed();

    プライベート:
        //メソッド

        //これは、検索が失敗した場合、または使用済みのすべてを解放するためにキャンセルされた場合に呼び出されます
        // メモリー
        void FreeAllNodes();

        //この呼び出しは、検索が終了したときに検索クラスによって行われます。多くのノードは
        //検索が終了したときにまだ存在するものを作成しました。これにより削除されます
        //検索が終了するとルーチン
        void FreeUnusedNodes();

        //ノードメモリ管理
        ノード*AllocateNode();

        void FreeNode(Node * node);

    プライベート:
        // データ

        //ヒープ(単純なベクトルですが、ヒープとして使用されます。SteveRabinのゲーム宝石の記事を参照してください)
        std :: vector m_OpenList;

        //クローズドリストはベクトルです。
        std :: vector m_ClosedList;

        //後継者は、ノードの後継者のタイプごとにユーザーが入力するベクトルです。
        //生成されます
        std :: vector m_Successors;

        // 州
        unsigned int m_State;

        //ステップをカウントします
        int m_Steps;

        //開始状態と目標状態のポインタ
        ノード*m_Start;
        ノード*m_Goal;

        //ソリューションチェーンの反復をサポートするために使用されるポインタ。
        ノード*m_CurrentSolutionNode;

    #if USE_FSA_MEMORY
        // メモリー
        FixedSizeAllocator m_FixedSizeAllocator;
    #endif

        //デバッグ:これら2つのイテレータを維持する必要があります
        //ユーザーDbg関数の場合
        typename std :: vector :: iterator iterDbgOpen;
        typename std :: vector :: iterator iterDbgClosed;

        //デバッグ:メモリ割り当てと空き容量をカウントします
        int m_AllocateNodeCount;

        bool m_CancelRequest;

    };

コンパイルできません。私が得るエラーは次のとおりです。

フィールドのタイプが不完全です'UserState'

どうすればこれを解決できますか?

4

1 に答える 1

3

それ以上苦労することなく、外部クラスのテンプレート引数だけを使用できます。ただし、A<X>ある型でインスタンス化する場合は、内側の型にアクセスするときにX型が完全であることを確認する必要があります。X

struct X;
A<X>::B a0; // ERROR: X is incomplete

struct X {};
A<X>::B a1; // OK: X is complete
于 2012-12-29T20:06:00.627 に答える