只要我不调用该函数,一切都很好,但是一旦我调用该函数,我得到一个未解析的外部符号。我的所有类都在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函数获得了这个未解决的外部符号错误,但只有当我在代码中调用它们时才会出现相同的错误。
仅供参考,错误是: 错误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
如果您需要其他任何内容,请告诉我,我一直在寻找数小时。
答案 0 :(得分:0)
你陷入了在cpp文件中定义模板函数的常见陷阱。
您需要在调用代码可以看到的任何位置定义函数,因为它仅在与特定模板参数一起使用时才实例化。
您的另一个选择是在cpp文件中将其专门实例化为ObjectCreate<SSE::GameObject>
。
您所做的是定义 在ObjectManager.cpp
中实例化的方式,并将其称为在另一个cpp文件中实例化。