gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:24:17 24 4
gpt4 key购买 nike

这是我的第一篇文章。我是游戏编程新手,使用的是 sfml 2.3.2 和 visual studio 2015。我使用的是 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);
}

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

最佳答案

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

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

关于C++ SFML游戏编程联动错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33885899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com