C++ 未解析的带有模板函数调用的外部符号

标签 c++ game-engine template-function

<分区>

只要我不调用该函数,一切都很好,但是一旦我调用该函数,我就会得到一个未解析的外部符号。我所有的类都在 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();
}

这会为新的游戏对象分配一个唯一的名称并在内存中创建它,然后将它存储到一个 vector 中。另一件要提到的事情是,对于许多与此类似的 ObjectManager 和 GameObject 函数,我一直遇到这个 Unresolved external symbol 错误,但仅当我在代码中调用它们时才相同。

仅供引用,错误是: 错误2 error 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中引用

如果您还需要什么,请告诉我,我已经搜索了几个小时。

最佳答案

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

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

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

您所做的是定义如何可以ObjectManager.cpp 中实例化它并像在另一个 cpp 文件中实例化一样调用它。

关于C++ 未解析的带有模板函数调用的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15376034/

相关文章:

android - 如何仅针对 Android 和 iOS 设置 libGDX 项目?

android - 如何在 libgdx 的舞台上绘制位图字体?

c++ - 如何编写一个模板函数,它接受一个数组和一个指定数组大小的 int

c++ - 为什么 boost interprocess named mutex docs 说每个进程都应该有自己的命名互斥体?

c++ - 如何在项目中只包含 BOOST 智能指针代码?

c++ - 引用 VC++ 代码或转换为 DLL?

android - 以最简单的方式将c++ opengl游戏移植到android和IOS

c++ - 使用 SFINAE、约束或概念来限制特化?

c++ - 以模板化函数作为参数的 STL 算法

c++ - 如何向 MFC WinMain 添加包装器?