我正在跟蹤一本關於SFML遊戲開發的書,但是我被困在第二章,因爲我無法編譯我剛剛編寫的代碼。Visual studio不會編譯帶* .inl實現的模板類
它幾乎是從書中逐字複製(成員變量名稱和異常文本除外)。我有使用C++和模板的經驗,但是我從來沒有見過這個錯誤,並且我一直盯着這個幾個小時,而且我沒有看到這段代碼有什麼問題。
這裏是我的* .h文件:
#pragma once
#include <map>
#include <memory>
#include <string>
#include <stdexcept>
#include <cassert>
#include "enumFile.h"
template <typename Resource, typename Identifier>
class ResourceHolder
{
public:
ResourceHolder(void);
~ResourceHolder(void);
void load(Identifier id, const std::string & filename);
template <typename Parameter>
void load(Identifier id, const std::string & filename,
const Parameter& secondParam);
Resource & get(Identifier id);
const Resource & get(Identifier id) const;
private:
std::map<Identifier, std::unique_ptr<Resource>> resourceMap;
};
#include "ResourceHolder.inl"
,這裏是我的* .INL文件:
template <typename Resource, typename Identifier>
void ResourceHolder<Resource, Identifier>::load(Identifier id, const std::string& filename)
{
// Create and load resource
std::unique_ptr<Resource> resource(new Resource());
if (!resource->loadFromFile(filename))
throw std::runtime_error("Failed to load resource: " + filename);
// If loading successful, insert resource to map
auto inserted = resourceMap.insert(std::make_pair(id, std::move(resource)));
assert(inserted.second);
}
template <typename Resource, typename Identifier>
template <typename Parameter>
void ResourceHolder<Resource, Identifier>::load(Identifier id, const std::string& filename,
const Parameter& secondParam)
{
// Create and load resource
std::unique_ptr<Resource> resource(new Resource());
if (!resource->loadFromFile(filename, secondParam))
throw std::runtime_error("Failed to load resource: " + filename);
// If loading successful, insert resource to map
auto inserted = resourceMap.insert(std::make_pair(id, std::move(resource)));
assert(inserted.second);
}
template <typename Resource, typename Identifier>
Resource& ResourceHolder<Resource, Identifier>::get(Identifier id)
{
auto found = resourceMap.find(id);
assert(found != resourceMap.end());
return *found->second;
}
template <typename Resource, typename Identifier>
const Resource& ResourceHolder<Resource, Identifier>::get(Identifier id) const
{
auto found = resourceMap.find(id);
assert(found != resourceMap.end());
return *found->second;
}
對不起,大量的代碼,但我絕望這裏。我得到了不尋常的錯誤,所有在* .inl文件,而不是寫它們,我拍了一個截圖:
任何想法如何解決這個問題?
編輯:一個關於如何使用類的字。
我和紋理命名空間中的枚舉(這就是「enumFile.h」是)
namespace Textures
{
enum ID {Landscape, Airplane, Missile};
}
當我想使用這個類,我用它如下:
ResourceHolder<sf::Texture, Textures::ID> textureHolder;
textureHolder.load(Textures::Airplane, "path/to/texture.png");
你寫的編譯與MSVC 2012年我剛delected「enumFile.h」的代碼。所以,問題是其他地方 –
我已經在'模板中的一些犯罪嫌疑人 無效ResourceHolder <資源,標識符> ::負載(標識符ID,常量的std :: string和文件名)'標識符必須是一個類或一個結構。 –