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

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

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

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

受付中

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

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

1回答

0グッド

0クリップ

529閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/08/21 03:15依頼された後にこの質問は修正されています

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

回答1

0

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

投稿2022/08/21 04:15

episteme

総合スコア15985

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/08/21 04:21

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

2022/08/21 05:10

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

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++

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