无法解析的外部符号与模板函数调用

C++ unresolved extern symbol with template function call

本文关键字:函数调用 符号 外部      更新时间:2023-10-16

只要我不调用函数,一切都很好,但是一旦我调用函数,我就会得到一个无法解析的外部符号。我所有的类都在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()返回Game的ObjectManager,它负责创建和删除对象,以及给对象它们的组件。ObjectCreate是一个模板函数,它返回一个指向新创建对象的指针。

从ObjectManager的。cpp文件:

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函数类似于这个,但只有当我在代码中调用它们时才一样。

仅供参考,错误为:LNK2019:未解析的外部符号"public: class SSE::GameObject * __thiscall SSE::ObjectManager::ObjectCreate(void)"(??$ObjectCreate@VGameObject@SSE@@ ObjectManager@SSE@ QAEPAVGameObject@1@XZ)在函数_SDL_main中引用C:SDLSimpleStateEngineSSEmain。obj SSE

如果你还需要什么就告诉我,我已经找了好几个小时了

您已经陷入了在cpp文件中定义模板函数的常见陷阱。

你需要在调用代码可以看到的任何地方定义函数,因为只有当它与特定的模板参数一起使用时,它才会被实例化。

你的另一个选择是在你的cpp文件中将它实例化为ObjectCreate<SSE::GameObject>

你所做的是定义它如何在ObjectManager.cpp中实例化,并调用它,就好像它在另一个cpp文件中实例化