我正在尝试构建一个BehaviourTree数据结构。 “main”类是“BTNode”,而离开(动作,命令或条件)是“BTLeaf”。因为我希望BTLeaf对我的实体执行某些操作,所以我将它作为一个模板类,它接受一个对象和一个成员函数指针。
btnode.h:
#ifndef BTNODE_H
#define BTNODE_H
#include <QLinkedList>
class BTNode
{
public:
BTNode();
BTNode(QLinkedList<BTNode *> &children);
~BTNode();
virtual bool execute() = 0;
protected:
QLinkedList<BTNode*> _children;
};
#endif // BTNODE_H
btleaf.h:
#ifndef BTLEAF_H
#define BTLEAF_H
#include "btnode.h"
template <class T> class BTLeaf : public BTNode
{
public:
BTLeaf(T* object, bool(T::*fpt)(void))
{ _object = object; _fpt=fpt; }
/* Does not work either:
BTLeaf(T* object, bool(T::*fpt)(void))
: BTNode()
{ _object = object; _fpt=fpt; }
*/
virtual bool execute()
{ return (_object->*_fpt)(); }
private:
bool (T::*_fpt)(); //member function pointer
T* _object;
};
#endif // BTLEAF_H
当我尝试构建解决方案时(使用Qt Creator),我得到:
spider.obj:-1: error: LNK2019: unresolved external symbol "public: __thiscall BTNode::BTNode(void)" (??0BTNode@@QAE@XZ) referenced in function "public: __thiscall BTLeaf<class Spider>::BTLeaf<class Spider>(class Spider *,bool (__thiscall Spider::*)(void))"
您可以在我的代码中看到我尝试过的解决方案。如果我删除public BTNode
部分并“手动”使用我的btleaf,我会得到所需的结果。有什么想法吗?
修改
在我的Spider
课程中以这种方式创建一个BTLeaf可能毫无价值(临时,出于测试目的):
BTLeaf<Spider> test(this, &Spider::sayHello);
test.execute();
答案 0 :(得分:2)
大概你声明的BTNode默认(无参数)构造函数没有在任何地方定义(至少,不是链接器看到的任何地方)。