提示コードですが以下の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
1 2void Player::Collision(std::shared_ptr<SDL::GameObject> obj) 3{ 4 //std::type_info info(SDL::BoxCollision); 5 6 addComponent(typeid(SDL::BoxCollision)); 7 std::dynamic_pointer_cast<SDL::BoxCollision>(getComponent(typeid(SDL::BoxCollision)))->isEnable = true; //ここのコード 8}
GameObjec.hpp
cpp
1 2std::shared_ptr<SDL::Component> SDL::GameObject::getComponent(const std::type_info& info) 3{ 4 if(std::string(info.name()) == std::string(typeid(SDL::BoxCollision).name())) 5 { 6 return std::dynamic_pointer_cast<Component>(boxCollision); 7 } 8 else if(std::string(info.name()) == std::string(typeid(SDL::CircleCollision).name())) 9 { 10 return std::dynamic_pointer_cast<Component>(circleCollision); 11 } 12 else if(std::string(info.name()) == std::string(typeid(SDL::LineCollision).name())) 13 { 14 return std::dynamic_pointer_cast<Component>(lineCollision); 15 } 16 else if(std::string(info.name()) == std::string(typeid(SDL::Sprite_Render).name())) 17 { 18 return std::dynamic_pointer_cast<Component>(spriteRender); 19 } 20 else 21 { 22 return nullptr; 23 } 24 25} 26 27void SDL::GameObject::addComponent(const std::type_info& info) 28{ 29 if(std::string(info.name()) == std::string(typeid(SDL::BoxCollision).name())) 30 { 31 boxCollision = std::make_shared<BoxCollision>(); 32 } 33 else if(std::string(info.name()) == std::string(typeid(SDL::CircleCollision).name())) 34 { 35 circleCollision = std::make_shared<CircleCollision>(); 36 } 37 else if(std::string(info.name()) == std::string(typeid(SDL::LineCollision).name())) 38 { 39 lineCollision = std::make_shared<LineCollision>(); 40 } 41 else if(std::string(info.name()) == std::string(typeid(SDL::Sprite_Render).name())) 42 { 43 spriteRender = std::make_shared<SDL::Sprite_Render>(); 44 } 45} 46 47

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/08/21 04:21
2022/08/21 05:10