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

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

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

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

受付中

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

samidare_chan
samidare_chan

総合スコア263

C++

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

1回答

-1評価

0クリップ

89閲覧

投稿2022/08/21 02:51

編集2022/08/21 14:10

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

回答1件

0

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

投稿2022/08/21 04:15

episteme

総合スコア15323

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

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

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

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

コメント

samidare_chan

2022/08/21 04:21

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

2022/08/21 05:10

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C++

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