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

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

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

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

Q&A

解決済

2回答

3498閲覧

構造体が未定義と表示されるエラーの解決方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

1クリップ

投稿2021/02/03 06:12

編集2021/02/04 04:11

提示コードのStage.hpp部でBlock.hppをインクルードすると以下の提示画像のエラーが発生します。また**Block.hppのインクルードをコメントアウトすると正常にコンパイル出来ます。**これはどうしてでしょうか? 全てのヘッダーにインクルードガードを実装してすべてソースファイルも定義しています。なぜなのでしょうか?

glmはglmライブラリです。

イメージ説明

// MapChip.hpp #define ___MAPCHIP_HPP_ #include <iostream> #include "glm/glm.hpp" // 自作 関係 #include "../LoadTexture.hpp" #include "../Collision.hpp" #include "../Actor_2D.hpp" #include "../Sprite.hpp" /*#################################################### * マップチップ 描画クラス ######################################################*/ class Sprite; struct TextureData; class MapChip : public Actor_2D { public: MapChip(Entry* e, std::shared_ptr<TextureData> data, glm::ivec2 pos, TextureUV size, bool col); // MapChip(); // MapChip(const MapChip& m); // ~MapChip(); // void Update() override; void Draw() override; Box_Collision_2D mCol; private: std::shared_ptr<Sprite> mSprite; std::shared_ptr<TextureData> Data; TextureUV UV; glm::ivec2 colSize; }; #endif
//Block.hpp #ifndef ___BLOCK_HPP #define ___BLOCK_HPP #include "../Actor_2D.hpp" #include "../Entry.hpp" #include "../LoadTexture.hpp" #include "MapChip.hpp" class Block : public Actor_2D { public: Block(Entry* e, std::shared_ptr<TextureData> data, TextureUV uv, glm::ivec2 pos); ~Block(); void Update() override; void Draw() override; std::vector<MapChip> block; }; #endif
//Stage.hpp #ifndef ___STAGE_HPP_ #define ___STAGE_HPP_ #include <glm/glm.hpp> #include <iostream> #include <vector> #include "Block.hpp" class Stage { public: Stage(Entry * e); //コンストラクタ ~Stage(); //デストラクタ void Update(); void Draw(); private: std::vector<Block> block; class Entry* Owner; }; #endif

hpp

1//LoadTexture.hpp 2#ifndef ___TEXTURE_HPP_ 3#define ___TEXTURE_HPP_ 4 5#include "Entry.hpp" 6#include "glm/glm.hpp" 7 8typedef unsigned char Byte; // Byte 9 10#include <vector> 11#include <iostream> 12 13 14// 描画UV座標を指定 15 16typedef struct TextureUV 17{ 18 glm::vec2 start; 19 glm::vec2 end; 20 21}TextureUV; 22 23// テクスチャデータ 24typedef struct TextureData 25{ 26 std::shared_ptr<std::vector<Byte>> mData; //画像データ 27 glm::ivec2 mSize; //サイズ 28 int channels; //チャンネル数 29}TextureData; 30 31 32//画像ファイルのバイナリを返す。  33std::shared_ptr<TextureData> LoadTexture(const char* FileName); 34 35 36int getTextureChannel(const char* str); 37glm::vec4 getRGBAColor(int r, int g, int b, int a); 38 39 40 41#endif 42
//Entry.hpp #ifndef ___ENTRY_H_ #define ___ENTRY_H_ #define SCREEN_WIDTH ((float)(16.0f * 60.0f)) //画面の横 #define SCREEN_HEIGHT ((float)(9.0f * 60.0f)) //画面の縦 #define PI ((float)3.14159265359f) //円周率 //自作ヘッダー 関係 #include "Camera.hpp" #include "Text.hpp" #include "Sprite.hpp" #include "Input.hpp" //#include "Sound.hpp" //#include "LoadTexture.hpp" //#include "Rectangle.hpp" //#include "Circle.hpp" #include "Actor_2D.hpp" // テスト 関係 #include "../Header/Game/Scene.hpp" //標準ヘッダー関係 #include "stdio.h" #include <iostream> #include <vector> #include <time.h> #include <random> //OpenGL関係 #include <GLEW/include/GL/glew.h> #include <gl/GL.h> #include <GLFW/include/GLFW/glfw3.h> //OpenAL関係 #include <OpenAL/include/al.h> #include <OpenAL/include/alc.h> //OpenCV 関係 #include <opencv2/opencv.hpp> //数学ライブラリ #include "glm/ext.hpp" /*############################################################################################################### # GLmain  #################################################################################################################*/ class Entry { public: Entry(); //コンストラクタ ~Entry(); //デスストラクタ bool Initialization(); //初期化 bool RunLoop(); //メインループ void Update(); //計算 void GenerateOutput(); //描画 GLFWwindow* GL_Window = nullptr; //OpenGLコンテキスト ALCdevice* AL_Device = nullptr; //デバイス ALCcontext* AL_Context = nullptr; //コンテキスト glm::ivec2 getWindowSize(); //画面サイズを取得 private: // #################################################################################################################################################################### std::unique_ptr<class Input> mInput; std::unique_ptr<class Scene> scene; // bool mIsRunLoop; //メインループ void ExitEntryKey(); //ゲーム終了 }; #endif

hpp

1//Sprite.hpp 2#ifndef ___SPRITE_HPP_ 3#define ___SPRITE_HPP_ 4 5//自作ヘッダー 6#include "Transform_2D.hpp" 7#include "Shader.hpp" 8#include "VertexData.hpp" 9#include "LoadTexture.hpp" 10 11//標準ヘッダー関係 12#include "stdio.h" 13#include <fstream> 14#include <sstream> 15#include <iostream> 16#include <vector> 17#include <crtdbg.h> 18 19 20//OpenGL関係 21#include "GLEW/include/GL/glew.h" 22#include "gl/GL.h" 23#include "GLFW/include/GLFW/glfw3.h" 24 25// OpenCV 26#include "opencv2/opencv.hpp" 27 28//数学ライブラリ 29#include "glm/ext.hpp" 30#include "glm/glm.hpp" 31//#include "Entry.hpp" 32 33 34 35 36/*############################################################################################################### 37# スプライト描画 38#################################################################################################################*/ 39 40class Entry; 41struct TextureData; 42class Sprite : public Transform_2D 43{ 44public: 45 46 Sprite(class Entry* g, std::shared_ptr<TextureData> sp); //コンストラクタ 47 ~Sprite(); //デストラクタ 48 Sprite(const Sprite& sp); //コピーコンストラクタ 49 void DrawGraph(glm::ivec2 pos,glm::vec2 start,glm::vec2 end); // 50 51 52 53 glm::vec2 getSize(); 54 55private: 56 57 58 VertexAttribute_2D vertex[6]; //頂点データ 59 60 class Entry* Entry; //Entry クラス 61 62 63 glm::vec2 mPicSize; //画像サイズ 64 65 66 //OpenGL 関係 67 GLuint VAO; 68 GLuint VBO; 69 GLuint IBO; 70 GLuint TextureID; //テクスチャID 71 72 std::shared_ptr<class Shader> shader; //シェーダープログラム 73 class Entry *Owner;//Entryクラス 74}; 75 76#endif;

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

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

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

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

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

int32_t

2021/02/03 08:59

Entry.hpp, glm.hpp, Collision.hpp, Actor_2D.hpp, Sprite.hpp など、include されるファイルをすべて開示してください。
t_obara

2021/02/03 10:05

エラーは「MapChip.hpp 37」としていますが、提示されたコードはMapChip.cppです。hppファイルがあるのですか?あるのであれば、そちらに問題があるのでは?もしcppしか無いのであれば、きちんと最新の状態にして、プロジェクトを作り直すなどして、再度コンパイルしてエラーをご提示ください。
t_obara

2021/02/03 15:04

循環参照しているのでは?
int32_t

2021/02/03 15:05

何のソースファイル(*.cpp)をコンパイルしたときにエラーが出るのかも重要です。必要なファイルをすべて開示しないと解決しませんよ。
thkana

2021/02/04 04:03

> 以下の提示インクルードコードは流石に関係ないので載せません それでは、代わりに回答者が実際にコンパイルを試みてエラーの有無を確認できるコードを提示してください。
退会済みユーザー

退会済みユーザー

2021/02/04 05:19

文章を修正しました。
int32_t

2021/02/04 06:36

やはり、ヘッダ内で #include しているヘッダのすべてを見ないと原因はわからないですね。Entry.hpp から Block.hpp を (間接的に) #include していれば説明がつくのですけど。
yumetodo

2021/02/04 14:42

そもそも論として__を含んだり、_[A-Z]を含む識別子は予約されているのでマクロでも使ってはいけないはず・・・。
yohhoy

2021/02/05 01:13

FYI: 解決済みのようですが関連参考情報として。極稀に(差分)ビルドでは問題解決せず、いったん全ての中間ファイルをクリーンアップ&フルビルドをかけるとうまくいくケースもあります。
guest

回答2

0

追記: この回答は的外れでした。ちゃんと #include は存在するようです。


エラーメッセージが「未定義」と言っているのですから、定義を与える必要があります。1つ目のヘッダ(MapChip.hpp?)で、2つ目のヘッダ(Texture.hpp?)を #include してください。

データメンバに使う型は、前方宣言ではダメです。


参考までに、Google の C++ スタイルガイドでは前方宣言は避けましょうと書いてあります。

前方宣言は可能な限り避けましょう。 必要ならば単にヘッダを#includeしてください。

(大規模なプロジェクトではそうも言ってられませんが)

投稿2021/02/03 06:18

編集2021/02/03 15:03
int32_t

総合スコア20841

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

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

退会済みユーザー

退会済みユーザー

2021/02/03 08:04 編集

すいません。提示コードを修正しました、依然としてエラーが出るのですがどうすればいいのでしょうか?
int32_t

2021/02/03 08:10

回答に書いたとおりに #include を足しましたか? そうは見えませんが。
退会済みユーザー

退会済みユーザー

2021/02/03 08:19

前方宣言をかけしましたがそれでもエラーが出ます。
int32_t

2021/02/03 08:24 編集

MapChip.hpp の class MapChip の定義より前に #Include "Texture.hpp" を足しましたか?
int32_t

2021/02/03 08:31

もしかして、2つ目のファイルはインクルードガードが ___TEXTURE_HPP_ なのにファイル名が LoadTexture.hpp ですか? 開示されている情報が半端だと、半端な回答しかできませんよ。
退会済みユーザー

退会済みユーザー

2021/02/03 08:53

文章を編集しました。
int32_t

2021/02/03 09:01

ほんとに LoadTexture.hpp だったのですね。では単純な「前方宣言ではなくて #include が必要」っていう問題ではなさそうですね。
guest

0

ベストアンサー

Sprite.hppでloadTexture.hppがインクルードされていることが問題でした。

投稿2021/02/05 02:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問