提示コードですが以下のGame.cpp
ですがなぜ以下のエラーが出るのでしょうか?エラーコードの意味も含めて対象法がわかりません。
スマートポインタを参考サイト通りダウンキャストしているのですが原因がわかりません。
知りたい事
エラーコードの意味と対象方法が知りたい。
参考サイト:https://chiku2gonzalez.hatenablog.com/entry/2014/10/23/230011
Error
shigurechan@shigurechan-System-Product-Name:~/Program/SDLGame/libTest$ make g++ -c -MMD -MP src/Enemy.cpp -o obj/Enemy.o g++ -c -MMD -MP src/Game.cpp -o obj/Game.o g++ -c -MMD -MP src/Main.cpp -o obj/Main.o g++ -c -MMD -MP src/Player.cpp -o obj/Player.o In file included from /usr/include/c++/11/memory:77, from src/../../lib/src/GameObject.hpp:6, from src/../../lib/src/SDLGame.hpp:9, from src/Player.hpp:6, from src/Player.cpp:1: /usr/include/c++/11/bits/shared_ptr.h: In instantiation of ‘std::shared_ptr<_Tp> std::dynamic_pointer_cast(const std::shared_ptr<_Tp>&) [with _Tp = SDL::BoxCollision; _Up = SDL::Component]’: src/Player.cpp:31:46: required from here /usr/include/c++/11/bits/shared_ptr.h:603:23: error: cannot ‘dynamic_cast’ ‘(& __r)->std::shared_ptr<SDL::Component>::<anonymous>.std::__shared_ptr<SDL::Component, __gnu_cxx::_S_atomic>::get()’ (of type ‘using element_type = std::remove_extent<SDL::Component>::type*’ {aka ‘class SDL::Component*’}) to type ‘using element_type = using element_type = std::remove_extent<SDL::BoxCollision>::type*’ {aka ‘class SDL::BoxCollision*’} (source type is not polymorphic) 603 | if (auto* __p = dynamic_cast<typename _Sp::element_type*>(__r.get())) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ make: *** [Makefile:25: obj/Player.o] エラー 1 shigurechan@shigurechan-System-Product-Name:~/Program/SDLGame/libTest$
Game.cpp
cpp
void Player::Collision(std::shared_ptr<SDL::GameObject> obj) { //std::type_info info(SDL::BoxCollision); addComponent(typeid(SDL::BoxCollision)); std::dynamic_pointer_cast<SDL::BoxCollision>(getComponent(typeid(SDL::BoxCollision)))->isEnable = true; //ここのコード }
GameObjec.hpp
cpp
std::shared_ptr<SDL::Component> SDL::GameObject::getComponent(const std::type_info& info) { if(std::string(info.name()) == std::string(typeid(SDL::BoxCollision).name())) { return std::dynamic_pointer_cast<Component>(boxCollision); } else if(std::string(info.name()) == std::string(typeid(SDL::CircleCollision).name())) { return std::dynamic_pointer_cast<Component>(circleCollision); } else if(std::string(info.name()) == std::string(typeid(SDL::LineCollision).name())) { return std::dynamic_pointer_cast<Component>(lineCollision); } else if(std::string(info.name()) == std::string(typeid(SDL::Sprite_Render).name())) { return std::dynamic_pointer_cast<Component>(spriteRender); } else { return nullptr; } } void SDL::GameObject::addComponent(const std::type_info& info) { if(std::string(info.name()) == std::string(typeid(SDL::BoxCollision).name())) { boxCollision = std::make_shared<BoxCollision>(); } else if(std::string(info.name()) == std::string(typeid(SDL::CircleCollision).name())) { circleCollision = std::make_shared<CircleCollision>(); } else if(std::string(info.name()) == std::string(typeid(SDL::LineCollision).name())) { lineCollision = std::make_shared<LineCollision>(); } else if(std::string(info.name()) == std::string(typeid(SDL::Sprite_Render).name())) { spriteRender = std::make_shared<SDL::Sprite_Render>(); } }
回答1件
良いと思った回答には高評価をしましょう。
評価が高い回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。
下記のような回答は推奨されていません。
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2022/08/21 04:21
2022/08/21 05:10