提示コードの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;
Entry.hpp, glm.hpp, Collision.hpp, Actor_2D.hpp, Sprite.hpp など、include されるファイルをすべて開示してください。
エラーは「MapChip.hpp 37」としていますが、提示されたコードはMapChip.cppです。hppファイルがあるのですか?あるのであれば、そちらに問題があるのでは?もしcppしか無いのであれば、きちんと最新の状態にして、プロジェクトを作り直すなどして、再度コンパイルしてエラーをご提示ください。
循環参照しているのでは?
何のソースファイル(*.cpp)をコンパイルしたときにエラーが出るのかも重要です。必要なファイルをすべて開示しないと解決しませんよ。
> 以下の提示インクルードコードは流石に関係ないので載せません
それでは、代わりに回答者が実際にコンパイルを試みてエラーの有無を確認できるコードを提示してください。
文章を修正しました。
やはり、ヘッダ内で #include しているヘッダのすべてを見ないと原因はわからないですね。Entry.hpp から Block.hpp を (間接的に) #include していれば説明がつくのですけど。
そもそも論として__を含んだり、_[A-Z]を含む識別子は予約されているのでマクロでも使ってはいけないはず・・・。
FYI: 解決済みのようですが関連参考情報として。極稀に(差分)ビルドでは問題解決せず、いったん全ての中間ファイルをクリーンアップ&フルビルドをかけるとうまくいくケースもあります。
回答2件
あなたの回答
tips
プレビュー