As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center作为指导。
                            
                        
                    
                
                                已关闭6年。
            
                    
我有一个C ++文件,如下所示。




    //用于文本调试
    #包括
    #包括
    //#包括
    #包括

    // stl包括
    #包括
    #包括
    #包括



    //快速固定大小的内存分配器,用于快速节点内存管理
    #include“ fsa.h”

    //可以禁用固定大小的内存分配器以比较性能
    //使用std new并删除它(如果将其关闭)
    #定义USE_FSA_MEMORY 1

    //禁用警告,指出调试信息包含被截断的行
    //出现在stl标头中
    #pragma warning(禁用: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
        };

        //节点表示搜索中的可能状态
        //用户提供的状态类型包含在此类型中

    上市:

        类Node {
        上市:

            节点* parent; //在搜索期间用于记录后继节点的父节点
            节点* child; //在搜索应用程序后使用,以反向查看搜索

            浮点g; //此节点的成本+它的前身(到目前为止的成本)
            浮动h; //到目标距离的启发式估算(启发式估算)
            浮动f; //前辈的累积成本以及自我和启发式的总和(costSoFar +启发式估计)。

            Node():
                    父项(0),子项(0),g(0.0f),h(0.0f),f(0.0f){
            }

             UserState m_UserState;
        };

        //为了对堆进行排序,STL需要比较功能,该功能使我们可以进行比较
        //两个节点的f值

        类HeapCompare_f {
        上市:

            bool operator()(常量节点* x,常量节点* y)const {
                //总启发式估算比较。
                返回x-> f> y-> f;
            }
        };

    上市:
        // 方法

        //构造函数只初始化私有数据
        AStarSearch(int MaxNodes = 1000);

        //随时调用以取消搜索并释放所有内存
        void CancelSearch();

        //设置开始状态和目标状态
        void SetStartAndGoalStates(UserState&Start,UserState&Goal);

        //将搜索前进一步
        unsigned int SearchStep();

        //用户调用此选项可将后继者添加到后继者列表中
        //扩展搜索边界时
        bool AddSuccessor(UserState&State);

        //释放解决方案节点
        //完成此操作后,将清理所有已使用的Node内存
        //搜索
        void FreeSolutionNodes();

        //遍历解决方案的函数

        //获取开始节点
        UserState * GetSolutionStart();

        //获取下一个节点
        UserState * GetSolutionNext();

        //获取结束节点
        UserState * GetSolutionEnd();

        //向后步进解决方案迭代器
        UserState * GetSolutionPrev();

        //对于教育用途和调试而言,能够查看
        //每个步骤的打开和关闭列表,这里有两个函数可以实现这一点。

        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();

        void sureMemoryFreed();

    私人的:
        // 方法

        //当搜索失败或取消搜索以释放所有已使用的内容时调用
        //记忆
        void FreeAllNodes();

        //搜索结束时由搜索类进行此调用。可能有很多节点
        //创建的内容在搜索结束时仍然存在。他们将被删除
        //搜索结束后的例行程序
        void FreeUnusedNodes();

        //节点内存管理
        节点* AllocateNode();

        无效的FreeNode(Node * node);

    私人的:
        //数据

        //堆(简单的矢量,但用作堆,请参阅Steve Rabin的游戏宝石文章)
        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;
    #万一

        // Debug:需要保留这两个迭代器
        //用于用户Dbg函数
        类型名称std :: vector :: iterator iterDbgOpen;
        类型名称std :: vector :: iterator iterDbgClosed;

        //调试:计算内存分配和空闲空间
        int m_AllocateNodeCount;

        bool m_CancelRequest;

    };



我无法编译它;我得到的错误是:


  字段的类型“ UserState”不完整


我该如何解决?

最佳答案

您可以轻松地仅使用外部类的模板参数。但是,当使用某些类型A<X>实例化X时,需要确保在访问内部类型时类型X是完整的:

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

struct X {};
A<X>::B a1; // OK: X is complete

10-06 02:51