我在网上搜索但我还没有找到答案,为什么我收到这个错误:
Error 1 error LNK2019: unresolved external symbol “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) referenced in 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
这是我的代码:
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,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() { }
在此先感谢您的回复!