1

関数を呼び出さない限り、すべて問題ありませんが、関数を呼び出すと、未解決の外部シンボルが取得されます。私のクラスはすべて 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 を返します。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();
}

これにより、新しいゲームオブジェクトに一意の名前が割り当てられ、メモリに作成され、ベクターに格納されます。言及すべきもう1つのことは、これと同様のObjectManagerおよびGameObject関数の多くでこの未解決の外部シンボルエラーが発生していることですが、コードでそれらを呼び出す場合にのみ同じです.

参考までに、エラーは次のとおりです: Error 2 error LNK2019: unresolved external symbol "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

他に何か必要なことがあれば教えてください。何時間も探しています。

4

1 に答える 1

0

テンプレート関数を cpp ファイルで定義するというよくある罠に陥っています。

関数は、特定のテンプレート パラメーターで使用された場合にのみインスタンス化されるため、呼び出し元のコードが参照できる任意の場所に関数を定義する必要があります。

ObjectCreate<SSE::GameObject>他のオプションは、cpp ファイルのように具体的にインスタンス化することです。

あなたが行ったこと、インスタンス化する方法を定義し、別の cpp ファイルでインスタンス化ObjectManager.cppしたかのように呼び出すことです。

于 2013-03-13T02:49:06.613 に答える