C++ SFML游戏编程联动错误

C++ SFML Game programming linkage error

这是我的第一个 post。我是游戏编程的新手,我正在使用 sfml 2.3.2 和 visual studio 2015.I 使用 sfml 游戏开发手册。我已经完成了所有工作,直到第 3 章我在构建时遇到了这个错误。

Severity Code Description Project File Line Error LNK2019 unresolved external symbol "public: class sf::Texture const & __thiscall ResourceHolder::get(enum Textures::ID)const " (?get@?$ResourceHolder@VTexture@sf@@W4ID@Textures@@@@QBEABVTexture@sf@@W4ID@Textures@@@Z) referenced in function "public: __thiscall Character::Character(enum Character::Type,class ResourceHolder const &)" (??0Character@@QAE@W4Type@0@ABV?$ResourceHolder@VTexture@sf@@W4ID@Textures@@@@@Z) SFML1 C:\Users\AdrielJunior\documents\visual studio 2015\Projects\SFML1\SFML1\Character.obj 1

代码我也放了

ResourceHolder.h

#pragma once
#include <map>
#include <string>
#include <memory>
#include <stdexcept>
#include <cassert>
#include <SFML/Graphics.hpp>

namespace Textures
{
    enum ID
    {
        Main,
        Enemy,
    };
}

template <typename Resource,typename Identifier>
class ResourceHolder
{
public:
    ResourceHolder();
    ~ResourceHolder();
    void load(Identifier id, const std::string& filename);
    template<typename Parameter>
    void load(Identifier id,const std::string& filename,const Parameter& secondParam);
    void load(Identifier id, const std::string& path,const std::string& filename);
    Resource& get(Identifier id);
    const Resource& get(Identifier id) const;
private:


private:
    std::map<Identifier, std::unique_ptr<Resource>> mResourceMap;

};

typedef sf::Texture texture;

typedef ResourceHolder<texture, Textures::ID> TextureHolder;

ResourceHolder.cpp

#include "ResourceHolder.h"

template<typename Resource, typename Identifier>
void ResourceHolder<Resource, Identifier>::load(Identifier id, const std::string & filename)
{
    std::unique_ptr<Resource> resource(new Resource);
    if (!resource->loadFromFile(filename))
        throw std::runtime_error("ResourceHolder::load - Failed to load " + filename);
    auto inserted = mResourceMap.insert(std::make_pair(id, std::move(resource)));
    assert(inserted.second);

}

template<typename Resource, typename Identifier>
void ResourceHolder<Resource, Identifier>::load(Identifier id, const std::string & path, const std::string & filename)
{
    std::unique_ptr<Resource> resource = new Resource(path);
    if (!resource->Load(filename))
        throw std::runtime_error("ResourceHolder::load - Failed to load " + path+ " " + filename);
    auto inserted = mResourceMap.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 = mResourceMap.find(id);
    assert(found != mResourceMap.end());
    return *found->second;
    // TODO: insert return statement here
}

template<typename Resource, typename Identifier>
const Resource& ResourceHolder<Resource, Identifier>::get(Identifier id) const
{
    auto found = mResourceMap.find(id);
    assert(found != mResourceMap.end());
    return *found->second;
    // TODO: insert return statement here
}

template<typename Resource, typename Identifier>
template<typename Parameter>
void ResourceHolder<Resource, Identifier>::load(Identifier id, const std::string & filename, const Parameter & secondParam)
{
    std::unique_ptr<Resource> resource ( new Resource());
    if (!resource->loadFromFile(filename,secondParam))
        throw std::runtime_error("ResourceHolder::load - Failed to load " + filename);
    auto inserted = mResourceMap.insert(std::make_pair(id, std::move(resource)));
    assert(inserted.second);
}

当我尝试在此代码中调用 ResourceHolder::get(Identifier Id) 时发生错误。

Character.h

#pragma once
#include "Entity.h"
//#include "ResourceIdentifier.h"
#include "ResourceHolder.h"

class Character: public Entity
{
public:
    enum Type
    {
        Main,
        Enemy,
    };
    explicit Character(Type type,const ResourceHolder<sf::Texture, Textures::ID>& textures);
    virtual void drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const;
private:

private:
    Type mType;
    sf::Sprite mSprite;
};

Character.cpp

#include "Character.h"

Textures::ID toTextureId(Character::Type type)
{
    switch (type)
    {
    case Character::Main:
        return Textures::Main;
        break;
    case Character::Enemy:
        return Textures::Enemy;
        break;

    }
}

Character::Character(Type type, const ResourceHolder<sf::Texture,Textures::ID> & textures):mType(type),
mSprite(textures.get(toTextureId(type)))
{

    sf::FloatRect bounds(mSprite.getLocalBounds());
    mSprite.setOrigin(bounds.width / 2.f, bounds.height / 2.f);
}

void Character::drawCurrent(sf::RenderTarget & target, sf::RenderStates states) const
{
    target.draw(mSprite, states);
}

你能帮我解决这个错误吗?提前致谢。

对于模板 classes,所有成员函数的代码都需要在 header 和 class 声明中,以便编译器可以生成正确的代码您尝试实例化它的类型。

(好的,有一些方法可以将 class 定义和代码分开,但它们并不容易。)