Unauthorized external character with pattern function

I searched the net, but have not yet found the answer why I received this error:

Error 1 error LNK2019: unresolved external character "public: class Mesh * __thiscall AssetManager :: GetAsset (class std :: basic_string, class std :: allocator>)" (?? $ GetAsset @PAVMesh @@@ AssetManager @@ QAEPAVMesh @@ V? $ Basic_string @DU? $ Char_traits @D @std @@ V? $ Allocator @D @ 2 @@ std @@@ Z) link in the function "public: void __thiscall SceneManager :: AddMesh (class std :: basic_string, class std :: allocator>) "(? AddMesh @SceneManager @@ QAEXV? $ basic_string @DU? $ char_traits @D @std @@ V? $ allocator @D @ 2 @@ std @@@ Z) C: \ Users \ Dirk \ documents \ visual studio 2010 \ Projects \ OpenGameEngine \ OpenGameEngine \ SceneManager.obj

Here is my code:

AssetManager.h

    #pragma once

    #include <string>
    #include <map>
    #include "Asset.h"
    #include "Mesh.h"

    using namespace std;

    class AssetManager
    {
    public:
        AssetManager(string rootFolder);

        bool LoadAsset(string assetName, int assetType, string assetFile,
                                                                   bool subDirectory);
        void UnloadAsset(string assetName);

        template <class T> T GetAsset(string assetName);

        bool AddAssetSubDirectory(int assetType, string subDirectory);  

    private:
        string m_rootFolder;
        map<int, string> m_assetSubs;
        map<string, Asset*> m_assets;
    };

AssetManager.cpp

    #include "AssetManager.h"

    AssetManager::AssetManager(string rootFolder)
    {
        m_rootFolder = rootFolder;
    }

    bool AssetManager::AddAssetSubDirectory(int assetType, string subDirectory)
    {
        if (m_assetSubs.find(assetType) == m_assetSubs.end())
        {
            m_assetSubs[assetType] = subDirectory;
            return true;
        }
        else
        {
            return false;
        }
    }
    bool AssetManager::LoadAsset(string assetName, int type, string assetFile,
              bool subDirectory)
    {
        string filePos;
        if (subDirectory)
        {
            filePos = m_rootFolder.append(m_assetSubs[type]).
                                                               append(assetFile);
        }
        else
        {
            filePos = m_rootFolder.append(assetFile);
        }
        return true;
    }
    void AssetManager::UnloadAsset(string assetName)
    {
        if (m_assets.find(assetName) != m_assets.end())
        {
            m_assets.erase(assetName);
        }
    }
    template <class T> T AssetManager::GetAsset(string assetName)
    {
        if (m_assets.find(assetName) != m_assets.end())
        {
            return m_assets[assetName];
        }
        else
        {
            return null;
        }
    }

SceneManager.h

    #pragma once

    #include <string>
    #include <map>
    #include "AssetManager.h"

    using namespace std;

    class SceneManager
    {
    public:
        static SceneManager* Instance();

        void AddMesh(string assetName);
        void RemoveMesh(string assetName);

        void Draw();
        void Run();

        void SetAssetManager(AssetManager*);

        void Destroy();

    private:
        SceneManager();
        SceneManager(SceneManager const&);
        ~SceneManager();
        SceneManager& operator=(SceneManager const&){};
        static SceneManager* m_Instance;

        AssetManager *m_assetMgr;

    private:
        map<string, Mesh*> m_staticMeshes;
    };

SceneManager.cpp

    #include "SceneManager.h"
    #include "AssetManager.h"

    SceneManager* SceneManager::m_Instance = NULL;

    SceneManager::SceneManager()
    {
        m_assetMgr = 0;
    }
       SceneManager::SceneManager(SceneManager const&)
           {

           }
    SceneManager::~SceneManager()
    {
        delete m_assetMgr;
        m_assetMgr = 0;
    }
    void SceneManager::Destroy()
    {
        delete m_Instance;
        m_Instance = 0;
    }

    SceneManager* SceneManager::Instance()
    {
        if (!m_Instance)
            m_Instance = new SceneManager();

        return m_Instance;
    }

    void SceneManager::SetAssetManager(AssetManager *am)
    {
        m_assetMgr = am; 
    }

    void SceneManager::AddMesh(string assetName)
    {
        m_assetMgr->GetAsset<Mesh*>(assetName);
    }

    void SceneManager::RemoveMesh(string assetName)
    {
        if (m_staticMeshes.find(assetName) != m_staticMeshes.end())
        {
            m_staticMeshes.erase(assetName);
        }
    }

    void SceneManager::Draw()
    {
        for (map<string, Mesh*>::Iterator it = m_staticMeshes.begin();
                        it != m_staticMeshes.end(); ++it)
        {
            it->second->Draw();
        }
    }
    void SceneManager::Run()
    {

    }

!

+4
4

++ .cpp. , , , .

, template <class T> T GetAsset(string assetName) AssetManager.h

+10

, CPP.

- "". GetAsset<Mesh*> SceneMagager.cpp, ++ GetAsset(), T- Mesh ( ). SceneManager.cpp AssetManager.h ( .cpp, GetAsset<T>), .

AssetManager::GetAsset .cpp .h, .

+2

, , AssetManager::GetAsset<Mesh*> .

:
SceneManager.cpp , AssetManager::GetAsset<Mesh*> . , , .
AssetManager.cpp , T .

- AssetManager::GetAsset AssetManager.h.

+1

. , , , . AssetManager.cpp, GetAsset < Mesh * > (...). . . in-paramators "" .

Mesh.h cpp , h , , .

-1

Source: https://habr.com/ru/post/1538293/


All Articles