Я пытаюсь создать структуру данных BehaviourTree. «Основной» класс - «BTNode», а листья (действия, команды или условия) - это «BTLeaf». Поскольку я хочу, чтобы BTLeaf выполнял некоторые действия над моими объектами, я сделал его классом шаблона, который принимает объект и указатель на функцию-член.Неразрешенный внешний при создании шаблона C++ Класс
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)" ([email protected]@[email protected]) referenced in function "public: __thiscall BTLeaf<class Spider>::BTLeaf<class Spider>(class Spider *,bool (__thiscall Spider::*)(void))"
вам может увидеть, что мое попытанное решение закомментировано в моем коде. Если я удалю часть public BTNode
и использую мой биттаф «вручную», я получаю желаемый результат. Есть идеи?
Edit: Это не может быть стоит ничего, что я создаю BTLeaf в моем Spider
классе этот путь (temporarely, для целей тестирования):
BTLeaf<Spider> test(this, &Spider::sayHello);
test.execute();
Вы определяете 'BTNode :: BTNode()'? Это не похоже на это. 'BTLeaf :: BTLeaf (T * object, bool (T :: * fpt) (void))' нуждается в BTNode :: BTNode() ', но это не похоже на то, что вы на самом деле определяете реализацию для' BTNode :: BTnode() '. – Cornstalks
Не знал, что проблема была такой простой. Я не хотел, чтобы BTNode :: BTNode() выполнял что-либо конкретное (за исключением наличия пустого списка детей), поэтому я не знал, что должен его реализовать. Большое спасибо Cornstalks! – Nepoxx
Если вам это не нужно, не определяйте его. Если он ничего не делает, вы можете просто удалить объявление 'BTNode();'. – Cornstalks