質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1299閲覧

std::dynamic_pointer_cast<> によるダウンキャストがビルドエラーになる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/08/21 02:51

編集2022/08/21 04:06

提示コードですが以下の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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

仮想関数を一つも持たない(polymorphicでない)場合、
dynamic_cast/dynamic_pointer_cast できないのでは?

投稿2022/08/21 04:15

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/08/21 04:21

なるほど質問ですがその場合どうやってダウンキャストするのでしょうか?カッコ型のやり方でエラーになります。
episteme

2022/08/21 05:10

「なるほど質問」ってなんですか? 「カッコ型のやり方」ってなんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問