我在将shared_ptr的sf :: Text,sf :: Sprite和sf :: Text放入shared_ptr数组时遇到问题 sf :: Drawable是以上所有的母类,是抽象的 这是游戏引擎功能:
GameEngine.h
y5 = JOIN y1 BY user_id LEFT OUTER, y4 BY in_reply_to_user_id_str;
y6 = FOREACH y5 GENERATE y1::$0,y1::$1,y1::$2,..........y4::$0,y4::$1;
STORE y6 INTO '$DATA_OUTPUT' USING JsonStorage();
GameEngine.cpp
template<class T>
void add(std::shared_ptr<T> actor);
Rendering.cpp
template<>
void GameEngine::add<sf::Drawable>(std::shared_ptr<sf::Drawable> actor)
{
drawables.insert(actor);
}
我在VS 2015中收到以下错误:
void Rendering::addDrawable(std::shared_ptr<sf::Sprite> sprite, sf::Vector2i texture_rect, const char* texture_name)
{
sf::Texture* _texture = engine.lock()->getGameData().getTexture(texture_name);
if (_texture) {
sprite->setTexture(*_texture);
sprite->setTextureRect(sf::IntRect(0, 0, texture_rect.x, texture_rect.y));
//What do i have to put in the below function?
engine.lock()->add(sprite);
}
}
有没有办法将子类的共享指针放入其母类的共享指针数组中?
编辑:
答案说:
仅仅因为Sprite是Drawable的子类,并不意味着
1>Rendering.obj : error LNK2019: symbole externe non résolu "public: void __thiscall GameEngine::add<class sf::Sprite>(class std::shared_ptr<class sf::Sprite>)" (??$add@VSprite@sf@@@GameEngine@@QAEXV?$shared_ptr@VSprite@sf@@@std@@@Z) référencé dans la fonction "public: void __thiscall Rendering::addDrawable(class std::shared_ptr<class sf::Sprite>,class sf::Vector2<int>,char const *)" (?addDrawable@Rendering@@QAEXV?$shared_ptr@VSprite@sf@@@std@@V?$Vector2@H@sf@@PBD@Z) 1>Rendering.obj : error LNK2019: symbole externe non résolu "public: void __thiscall GameEngine::add<class sf::Shape>(class std::shared_ptr<class sf::Shape>)" (??$add@VShape@sf@@@GameEngine@@QAEXV?$shared_ptr@VShape@sf@@@std@@@Z) référencé dans la fonction "public: void __thiscall Rendering::addDrawable(class std::shared_ptr<class sf::Shape>,char const *)" (?addDrawable@Rendering@@QAEXV?$shared_ptr@VShape@sf@@@std@@PBD@Z) 1>Rendering.obj : error LNK2019: symbole externe non résolu "public: void __thiscall GameEngine::add<class sf::Text>(class std::shared_ptr<class sf::Text>)" (??$add@VText@sf@@@GameEngine@@QAEXV?$shared_ptr@VText@sf@@@std@@@Z) référencé dans la fonction "public: void __thiscall Rendering::addDrawable(class std::shared_ptr<class sf::Text>,char const *,char const *,class sf::Color)" (?addDrawable@Rendering@@QAEXV?$shared_ptr@VText@sf@@@std@@PBD1VColor@sf@@@Z)
是shared_ptr<Sprite>
的子类。
那我为什么要这样做?
shared_ptr<Drawable>
答案 0 :(得分:2)
仅因为Sprite
是Drawable
的子类,并不意味着shared_ptr<Sprite>
是shared_ptr<Drawable>
的子类。
当编译器看到这个时:
engine.lock()->add(sprite);
它会根据overload resolution规则查找成员函数add(shared_ptr<sf::Sprite>)
。
即使shared_ptr<Sprite>
不是shared_ptr<Drawable>
的子类,也有可用的隐式转换,因此它将成为候选者。
但是这个:
template<class T>
void add(std::shared_ptr<T> actor);
为任何类型提供了声明功能,但没有定义。因此,它提供精确匹配,并由编译器选择。这就是你得到链接器错误的原因。
解决此问题的一种方法是使用std::static_pointer_cast,如下所示:
engine.lock()->add(std::static_pointer_cast<Drawable>(sprite));
我还会重新考虑是否/为什么你需要上面的模板 - 除了给你链接时间错误而不是编译时错误之外,我无法看到服务的目的。