2012-03-27 2 views
1

Я пытаюсь создать структуру данных 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(); 
+4

Вы определяете 'BTNode :: BTNode()'? Это не похоже на это. 'BTLeaf :: BTLeaf (T * object, bool (T :: * fpt) (void))' нуждается в BTNode :: BTNode() ', но это не похоже на то, что вы на самом деле определяете реализацию для' BTNode :: BTnode() '. – Cornstalks

+0

Не знал, что проблема была такой простой. Я не хотел, чтобы BTNode :: BTNode() выполнял что-либо конкретное (за исключением наличия пустого списка детей), поэтому я не знал, что должен его реализовать. Большое спасибо Cornstalks! – Nepoxx

+0

Если вам это не нужно, не определяйте его. Если он ничего не делает, вы можете просто удалить объявление 'BTNode();'. – Cornstalks

ответ

2

Предположительно, что BTnode по умолчанию (без аргументов) конструктора вы заявили, что не определены нигде (по крайней мере, нигде, что видит ваш линкер).

+0

Это точно! Для тех, у кого может возникнуть такая же ситуация, пожалуйста, см. Комментарий Корнстейков по моему оригинальному вопросу для получения дополнительной информации. Благодаря! – Nepoxx

Смежные вопросы