Неразрешенный внешний при создании C ++ Template Class - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь построить структуру данных BehaviourTree. «Основной» класс - «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 «вручную», я получаю желаемый результат. Есть идеи?

Edit: Это может ничего не стоить, чтобы я создал BTLeaf в своем классе Spider таким образом (временно, для целей тестирования):

BTLeaf<Spider> test(this, &Spider::sayHello);
test.execute();

1 Ответ

2 голосов
/ 28 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...