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

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

新規登録して質問してみよう
ただいま回答率
85.42%
コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

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

Q&A

解決済

2回答

2435閲覧

[コンパイルエラー] 構造体が定義されていませんのエラー原因が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

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

0グッド

0クリップ

投稿2022/08/13 02:13

編集2022/08/13 03:12

提示コードですが以下のエラーが出るのですが「error: ‘Console::ListItem’ has not been declared」「Console::ListItemが定義されていません」とはどういう意味なのでしょうか?同じ名前空間のなので定義されているはずなのですが?

確認したこと

インクルードガードがそれぞれ違うかどうか確認
同じ名前空間かどうか確認
スペルミスを確認

知りたいこと

1,エラー原因が知りたいなぜ定義されてないなのか?
2,Console::ListItemListItemは何が違うのか?

Error
shigurechan@shigurechan-System-Product-Name:~/Program/ScriptEditor$ make all make ext_lib make[1]: ディレクトリ '/home/shigurechan/Program/ScriptEditor' に入ります ar x /usr/lib/libncurses.a --output lib/obj make[1]: ディレクトリ '/home/shigurechan/Program/ScriptEditor' から出ます make make[1]: ディレクトリ '/home/shigurechan/Program/ScriptEditor' に入ります g++ -c -MMD -MP src/Main.cpp -o obj/Main.o In file included from src/../lib/src/Console.hpp:9, from src/MainScreen.hpp:6, from src/Main.cpp:2: src/../lib/src/MenuWindow.hpp:20:22: error: ‘Console::ListItem’ has not been declared 20 | void SetItem(Console::ListItem i); | ^~~~~~~ src/../lib/src/MenuWindow.hpp:33:30: error: ‘ListItem’ is not a member of ‘Console’ 33 | std::vector<Console::ListItem> item; | ^~~~~~~~ src/../lib/src/MenuWindow.hpp:33:38: error: template argument 1 is invalid 33 | std::vector<Console::ListItem> item; | ^ src/../lib/src/MenuWindow.hpp:33:38: error: template argument 2 is invalid In file included from src/Main.cpp:2: src/MainScreen.hpp:25:14: error: ‘ListWindow’ in namespace ‘Console’ does not name a type 25 | Console::ListWindow menu; | ^~~~~~~~~~ make[1]: *** [Makefile:25: obj/Main.o] エラー 1 make[1]: ディレクトリ '/home/shigurechan/Program/ScriptEditor' から出ます make: *** [Makefile:56: all] エラー 2 shigurechan@shigurechan-System-Product-Name:~/Program/ScriptEditor$
Console.hpp

cpp

1#ifndef ___CONSOLE_HPP___ 2#define ___CONSOLE_HPP___ 3 4#include <iostream> 5#include <glm/glm.hpp> 6#include <ncurses.h> 7#include "Debug.hpp" 8#include "Help.hpp" 9#include "MenuWindow.hpp" 10//#include "ListWindow.hpp" 11 12namespace Console 13{ 14 struct ListItem 15 { 16 std::string title; 17 Console::ColorPair color; 18 int renderOption = 0; 19 }; 20 21 22 #define LINE_BUFFER ((int)1000) 23 24 void Init(); //初期化 25 26 void SetDispInput(bool b); //入力文字 27 void SetInputBuffer(bool b); //入力バッファ 28 void SetDispCursor(WINDOW *win,bool b); //カーソル 29 void SetKeyPad(WINDOW *win,bool b); //特殊キー 30 31 void RenderBuffer(WINDOW *win); //バッファー描画 32 void ClearBuffer(WINDOW *win); //バッファークリア 33 34 void Close(); //プログラム終了 35 36 //デバッグ 37 void Init_Log(const char* fileName); //ログファイルを指定 38 void Init_File(const char* fileName); //テキストファイルを指定 39 void Init_ErrorLog(const char* fileName); //エラーログファイルを指定 40 41 void Write(const char* fmt,...); //logFileに書き込み  42 void WriteLine(const char* fmt,...); //logFileに書き込み 改行 43 44 void Write_File(const char* fileName,const char* fmt,...); //指定したログファイルに書き込み 45 void Write_FileLine(const char* fileName,const char* fmt,...); //指定したログファイルに書き込み 改行 46 47 48 //描画 49 void RenderString(ColorCode fg,ColorCode bg,WINDOW *win,glm::ivec2 pos,const char* fmt,...); 50 51 void RenderString_Bold(ColorCode fg,ColorCode bg,WINDOW *win,glm::ivec2 pos,const char* fmt,...); 52 53 void RenderString_Blink(ColorCode fg,ColorCode bg,WINDOW *win,glm::ivec2 pos,const char* fmt,...); 54 55 void RenderString_UnderLine(ColorCode fg,ColorCode bg,WINDOW *win,glm::ivec2 pos,const char* fmt,...); 56 57 glm::ivec2 GetScreenSize(WINDOW* win); //画面サイズを取得 58 std::string InputString(); //文字列入力 59 int Input(); //文字入力 60 61 62 63 64} 65#endif 66
MenuWindow.hpp

cpp

1#ifndef ___MENUWINDOW_HPP___ 2#define ___MENUWINDOW_HPP___ 3#include <string> 4#include <vector> 5#include <ncurses.h> 6#include <glm/glm.hpp> 7#include "Console.hpp" 8namespace Console 9{ 10 class MenuWindow 11 { 12 public: 13 14 15 MenuWindow(); 16 ~MenuWindow(); 17 18 19 20 void SetItem(Console::ListItem i); 21 22 void Render(WINDOW *win,glm::ivec2 pos); 23 void Update(); 24 void SetCursorDown(); 25 void SetCursorUp(); 26 27 28 private: 29 30 31 32 Console::ColorPair selectColor; 33 std::vector<Console::ListItem> item; 34 glm::ivec2 cursorPosition; 35 glm::ivec2 cursor = glm::ivec2(0,0); 36 }; 37 38} 39#endif
Main.cpp

cpp

1#include <iostream> 2#include "MainScreen.hpp" 3#include <memory> 4//#include <Magick++.h> 5#include "../lib/src/Console.hpp" 6 7 8int main() 9{ 10 Console::Init(); 11 Console::Init_ErrorLog("log/error.log"); 12 Console::Init_Log("log/log.log"); 13 14 Console::RenderBuffer(NULL); 15 16 17 std::unique_ptr<MainScreen> main = std::make_unique<MainScreen>(); 18 19 while(true) 20 { 21 main->Loop(); 22 23 if (main->getExit() == true) 24 { 25 break; 26 } 27 } 28 29 Console::Close(); 30 31 return 0; 32} 33
MainScreen.hpp

cpp

1#ifndef ___MAINSCREEN_HPP___ 2#define ___MAINSCREEN_HPP___ 3#include <vector> 4#include <filesystem> 5#include <glm/glm.hpp> 6#include "../lib/src/Console.hpp" 7 8 9class MainScreen 10{ 11 12public: 13 MainScreen(); 14 ~MainScreen(); 15 16 void Loop(); 17 18 bool getExit(); 19private: 20 21 void Update(); 22 void Render(); 23 void KeyInput(); 24 25 Console::ListWindow menu; 26 27 28 glm::ivec2 cursorPosition; 29 bool isExit = false; 30}; 31 32 33#endif 34

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

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

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

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

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

SaitoAtsushi

2022/08/13 02:57

Main.cpp を提示してください。 その中で #include "MenuWindow.hpp" #include "Console.hpp" とでも書いてあったらそれが原因ですね。
退会済みユーザー

退会済みユーザー

2022/08/13 03:30 編集

なるほど自己解決ようにして解決したのですがConsole::ListItem とListItemは何が違うのでしょうか?名前空間を指定しなのとそうじゃない場合です。同じ名前空間で
guest

回答2

0

ベストアンサー

include の順序の問題です。

依存関係をまとめると

  • Console.hpp → MenuWindow.hpp
  • MenuWindow.hpp → Console.hpp
  • Main.cpp → MainScreen.hpp, Console.hpp
  • MainScreen.hpp → Console.hpp

ということになりますから、インクルードガードも踏まえてこれが全て Main.cpp に展開されると

  • MenuWindow.hpp の内容
  • Console.hpp の内容
  • MainScreen.hpp の内容
  • Main.cpp の内容

という順序です。

MenuWindow.hpp 内の宣言を読んでいる段階ではまだ Console.hpp の内容は処理されていません。 ListItem というクラスの存在のことはまだ知らない故に「宣言されていない名前が使われた」という意味のエラーになります。


名前の探索は基本的にはスコープが狭い側から順に行われます。 (例外もありますが、詳細は説明しませんので仕様の当該項目をご覧ください。)

大まかに言えば

  • (その名前を含む) ブロックスコープ
  • (〃) 関数スコープ
  • (〃) クラススコープ
  • (〃) 名前空間スコープ
  • グローバルスコープ

の順序で探索されるということです。 また、スコープ解決演算子でスコープが示されたときはその修飾名の頭にある名前から順に探索されます。

上述のインクルード順序の問題を解決したとしてこの質問のコードを例にとって言うと、 MenuWindow.hpp 内の void SetItem(Console::ListItem i); というところに現れる Console::ListItem は上述の探索順序で見ていくとグローバルスコープにある名前空間 Console を発見した上でその中にある ListItem であるという解釈になります。

名前を修飾せずに単に ListItem と書いてあったとしたら上述の順序で探索すれば現在の名前空間 Console の下にある ListItem を発見するでしょう。

つまりこの場合は名前空間スコープで修飾してもしなくても結果的に同じものを発見します。

投稿2022/08/13 04:21

SaitoAtsushi

総合スコア5542

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

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

0

以下のような構造体のみのヘッダーファイルを用意してそれをインクルードすることで解決しました。

cpp

1#ifndef ___DATA_HPP___ 2#define ___DATA_HPP___ 3#include <iostream> 4 5namespace Console 6{ 7 8 #define KEY_ESC ((int)27) 9 #define KEY_RETURN ((int)10) 10// #define KEY_BACKSPACE ((int)127) 11 12 13 enum class ColorCode 14 { 15 Black, 16 Blue, 17 Green, 18 Cyan, 19 Red, 20 Magenta, 21 Brown, 22 White, 23 Bright_Black, 24 Bright_Blue, 25 Bright_Green, 26 Bright_Cyan, 27 Bright_Red, 28 Bright_Magenta, 29 Yellow, 30 Bright_White, 31 32 None = -1, 33 34 }; 35 36 typedef struct 37 { 38 ColorCode foreGround; 39 ColorCode backGround; 40 }ColorPair; 41 42 43 44 struct ListItem 45 { 46 std::string title; 47 Console::ColorPair color; 48 int renderOption = 0; 49 }; 50}; 51#endif 52

投稿2022/08/13 03:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問