Я следую книге о разработке игр SFML, но я застрял во второй главе, потому что я не могу скомпилировать код, который я только что написал.
Это почти по одному слову копируется из книги (кроме имени переменной-члена и текста исключения). У меня есть опыт работы с С++ и шаблонами, но я никогда не видел эту ошибку раньше, и я смотрел на это несколько часов, и я не вижу ничего плохого в этом коде.
Вот мой *.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, вместо того, чтобы писать их, я сделал снимок экрана:
Любая идея, как это исправить?
EDIT: слово о том, как используется класс.
У меня есть и перечисление внутри пространства имен текстур (вот что такое "enumFile.h" )
namespace Textures
{
enum ID {Landscape, Airplane, Missile};
}
Когда я хочу использовать класс, я использую его следующим образом:
ResourceHolder<sf::Texture, Textures::ID> textureHolder;
textureHolder.load(Textures::Airplane, "path/to/texture.png");