樽見
Posted: 2017年7月08日(土) 19:39
こんにちは。
今、C++でシュミレーションゲームを作っているのですが、その中で「ファイルをまたいで構造体が使えない」という症状が起きました。
関係するヘッダーファイル2つだけをシンプルに書き換えてみると、全く同じエラーが発生しましたので、投稿させていただきます。
Header.h
Header1.h
※エラーの箇所は5つあり、すべてHeader1.hです。該当箇所にコメントをつけておきました。
エラー 1 error C2079: 'Header1::a' が 未定義の struct 'A_' で使用しています。
エラー 2 error C2079: 'Header1::b' が 未定義の struct 'B_' で使用しています。
エラー 3 error C2027: 認識できない型 'A_' が使われています。
エラー 4 error C2079: 't' が 未定義の struct 'A_' で使用しています。
エラー 5 error C2440: '初期化中' : 'initializer-list' から 'int' に変換できません。
どうしてもこのクラスで他のヘッダー宣言の構造体を使いたいのですが、どうすれば実現できるでしょうか?
また、どうしてHeader.hだと、「C c;」と「D d;」のところでエラーが起きないのでしょうか?
ご解答よろしくお願いいたします。
今、C++でシュミレーションゲームを作っているのですが、その中で「ファイルをまたいで構造体が使えない」という症状が起きました。
関係するヘッダーファイル2つだけをシンプルに書き換えてみると、全く同じエラーが発生しましたので、投稿させていただきます。
Header.h
#pragma once
class Header;
typedef struct A_ A;
typedef struct B_ B;
#include <iostream>
#include "Header1.h"
typedef struct A_{
int t;
double c;
}A;
typedef struct B_{
short d;
long w;
}B;
class Header{
public:
void Draw(){ std::cout << "クラスHeaderが作られました" << std::endl; }
private:
A a;
B b;
C c;
D d;
A myfunc(){
A t = {2, 3.9};
std::cout << "A型のtを初期化" << std::endl;
}
};
Header1.h
#pragma once
class Header1;
typedef struct C_ C;
typedef struct D_ D;
#include <iostream>
#include "Header.h"
typedef struct C_{
int t;
double c;
}C;
typedef struct D_{
short d;
long w;
}D;
class Header1{
public:
void Draw(){ std::cout << "クラスHeader1が作られました" << std::endl; }
private:
A a; //エラー番号1
B b; //エラー番号2
C c;
D d;
A myfunc(){ //エラー番号3
A t = { 2, 3.9 }; //エラー番号4と5
std::cout << "A型のtを初期化" << std::endl;
}
};
エラー 1 error C2079: 'Header1::a' が 未定義の struct 'A_' で使用しています。
エラー 2 error C2079: 'Header1::b' が 未定義の struct 'B_' で使用しています。
エラー 3 error C2027: 認識できない型 'A_' が使われています。
エラー 4 error C2079: 't' が 未定義の struct 'A_' で使用しています。
エラー 5 error C2440: '初期化中' : 'initializer-list' から 'int' に変換できません。
どうしてもこのクラスで他のヘッダー宣言の構造体を使いたいのですが、どうすれば実現できるでしょうか?
また、どうしてHeader.hだと、「C c;」と「D d;」のところでエラーが起きないのでしょうか?
ご解答よろしくお願いいたします。