Неразрешенный внешний символ C++ с вызовом функции шаблона

Пока я не вызываю функцию, все в порядке, но как только я вызываю функцию, я получаю неразрешенный внешний символ. Все мои классы находятся в пространстве имен SSE (мое собственное) и до сих пор работали нормально. Позволь мне показать.

#include "SDL.h"
#include "Game.h"
#include "GameObject.h"
#include <tchar.h>

SSE::Game Pong;

int _tmain(int argc, char* argv[])
{
    SSE::GameObject* object;
    Pong.Initialize("Pong!");
    object = Pong.Objects().ObjectCreate<SSE::GameObject>();
    while (!Pong.bQuit)
    {
        Pong.Update();
        Pong.Draw();
    }
    return 0;
}

Это где я вызываю функцию. Game - это класс, который работает за кулисами (у меня все хорошо с этим классом), Game.Objects() возвращает ObjectManager Game, который отвечает за создание и удаление объектов, а также предоставляет объектам их компоненты. ObjectCreate - это функция шаблона, которая возвращает указатель на новый созданный объект.

Из файла.cpp ObjectManager:

template <class G>G* ObjectManager::ObjectCreate()
{
    ObjectList* tempObjList;
    tempObjList = new tempObjList();
    tempObjList->objectType = G->ClassName();
    tempObjList->objectTypeNumber = 0;
    for (unsigned int i = 0; i < v_objList.size(); i++;)
    {
        if (v_objList[i]->objectType == tempObjList->objectType)
            tempObjList->objectTypeNumber++;
    }
    tempObjList->gameObject = new G(tempObjList->objectType + "_" + tempObjList->objectTypeNumber);
    v_objList.push_back(tempObjList);
    if (v_objList.back() != tempObjList)
    {
        delete tempObjList;
        return NULL;
    }
    return v_objList.back();
}

Это присваивает уникальное имя новому GameObject и создает его в памяти, а затем сохраняет его в векторе. Еще одна вещь, которую стоит упомянуть, это то, что я получаю эту неразрешенную внешнюю ошибку символа для многих функций ObjectManager и GameObject, похожих на эту, но точно так же, только если я вызываю их в коде.

Просто для справки: ошибка 2: ошибка LNK2019: неразрешенный внешний символ "public: class SSE::GameObject * __thiscall SSE::ObjectManager::ObjectCreate(void)" (??$ObjectCreate@VGameObject@SSE@@@ObjectManager@SSE@@QAEPAVGameObject@1@XZ) ссылка на функцию _SDL_main C:\SDL\SimpleStateEngine\SSE\main.obj SSE

Дайте мне знать, если вам нужно что-нибудь еще, я искал несколько часов.

1 ответ

Вы попали в общую ловушку определения функции шаблона в файле cpp.

Вам нужно определить функцию везде, где ее может увидеть вызывающий код, потому что она создается только тогда, когда она используется с конкретными параметрами шаблона.

Другой вариант - создать его как ObjectCreate<SSE::GameObject> в вашем файле cpp.

То, что вы сделали, это определите, как это может быть реализовано в ObjectManager.cpp и вызвал его так, как будто он был создан в другом файле cpp.

Другие вопросы по тегам