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

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

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

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

Q&A

解決済

1回答

7648閲覧

前方宣言をしたClassのメンバ構造体にアクセスするとエラーがでる

fdaskjlfda

総合スコア40

C++

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

0グッド

0クリップ

投稿2019/08/10 04:05

編集2019/08/10 04:27

ソースコード

c++

1 2#include <memory> 3 4class B; 5 6class A 7{ 8 int getHoge(B::Hoge hoge) 9 { 10 return hoge.huga; 11 } 12}; 13 14class B 15{ 16public: 17 struct Hoge 18 { 19 int huga; 20 }; 21 std::unique_ptr<A> a; 22}; 23 24int main() 25{ 26 B b; 27}

error

1test.cpp:8:20: error: 'B::Hoge' has not been declared 2 int getHoge(B::Hoge hoge) 3 ^~~~ 4test.cpp: In member function 'int A::getHoge(int)': 5test.cpp:10:21: error: request for member 'huga' in 'hoge', which is of non-class type 'int' 6 return hoge.huga;

質問内容

上のソースコードでのエラーはなぜ起こっていて、どうすれば解決するかを教えていただけると嬉しいです

追記1

c++

1int getHoge(B::Hoge hoge) 2 { 3 return hoge.huga; // hoge.hugaはclass B;しただけではわからない 4 }

というのは、このサイトを読んでわかりました。
ですが、関数の引数としてB::Hogeを使う場合はどのようにすればよいか見当がつきません。

追記2

僕が作ろうとしているのは、Afile, Bfileがあり、以下のソースコードのように互いに依存しています。

c++

1// Afile.hpp 2 3#include "Bfile.hpp" 4 5class B; 6 7class A { 8 int getHoge(B::Hoge hoge); 9};

c++

1// Bfile.hpp 2 3#include <memory> 4#include "Afile.hpp" 5 6class A; 7 8class B { 9 struct Hoge { 10 int huga; 11 }; 12 std::unique_ptr<A> a; 13}; 14

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

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

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

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

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

guest

回答1

0

ベストアンサー

ですが、関数の引数としてB::Hogeを使う場合はどのようにすればよいか見当がつきません。

class Bを先に定義するのが手っ取り早いかと思います。

C++

1#include <memory> 2 3class A; 4 5class B 6{ 7public: 8 struct Hoge 9 { 10 int huga; 11 }; 12 std::unique_ptr<A> a; 13}; 14 15class A 16{ 17 int getHoge(B::Hoge hoge) 18 { 19 return hoge.huga; 20 } 21}; 22 23 24 25int main() 26{ 27 B b; 28}

投稿2019/08/10 04:15

maisumakun

総合スコア145183

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

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

fdaskjlfda

2019/08/10 04:18

回答ありがとうございます! `class B`を先に定義することができない場合、どうすればよいでしょうか?
maisumakun

2019/08/10 04:28 編集

おそらく無理かと思います。B::Hogeという型だけなら前方宣言で対応できるかもしれませんが、メンバ参照が入ると有効な宣言をする以外に手はありません。
maisumakun

2019/08/10 04:31

(追記2を踏まえて) Afile.hppでstruct B::Hoge;も前方宣言しておいて、関数の実装はAfile.hppとBfile.hppを両方とも#includeしたCPPファイルで行う、という方法はあるかと思います。
fdaskjlfda

2019/08/10 04:40

ありがとうございます つまり、こういうことでしょうか? ``` // AFile.hpp #include <memory> // #include "BFile.hpp" class B; struct B::Hoge; class A { int getHoge(std::unique_ptr<B::Hoge> hoge); }; // BFile.hpp // #include "Afile.hpp" class A; class B { public: struct Hoge { int huga; }; std::unique_ptr<A> a; }; // main.cpp // #include "Afile.hpp" // #include "BFile.hpp" int A::getHoge(B::hoge hoge) { return hoge.huga; } int main() { B b; } ``` これをコンパイルすると、 ``` test.cpp:5:11: error: invalid use of incomplete type 'class B' struct B::Hoge; ^~~~ test.cpp:4:7: note: forward declaration of 'class B' class B; ^ test.cpp:9:36: error: incomplete type 'B' used in nested name specifier int getHoge(std::unique_ptr<B::Hoge> hoge); ^~~~ test.cpp:9:36: error: incomplete type 'B' used in nested name specifier test.cpp:9:40: error: template argument 1 is invalid int getHoge(std::unique_ptr<B::Hoge> hoge); ^ test.cpp:9:40: error: template argument 2 is invalid test.cpp:31:19: error: 'int A::getHoge' is not a static data member of 'class A' int A::getHoge(B::hoge hoge) ^~~~ test.cpp:31:19: error: 'hoge' is not a member of 'B' ``` というエラーメッセージがでてきます 初歩的なところでたくさん質問して申し訳ありません
fdaskjlfda

2019/08/10 04:42

int A::getHoge(B::hoge -> Hogeに修正しても、まだエラーが出てきます test.cpp:5:11: error: invalid use of incomplete type 'class B' struct B::Hoge; ^~~~ test.cpp:4:7: note: forward declaration of 'class B' class B; ^ test.cpp:9:36: error: incomplete type 'B' used in nested name specifier int getHoge(std::unique_ptr<B::Hoge> hoge); ^~~~ test.cpp:9:36: error: incomplete type 'B' used in nested name specifier test.cpp:9:40: error: template argument 1 is invalid int getHoge(std::unique_ptr<B::Hoge> hoge); ^ test.cpp:9:40: error: template argument 2 is invalid test.cpp:31:5: error: no declaration matches 'int A::getHoge(B::Hoge)' int A::getHoge(B::Hoge hoge) ^ test.cpp:9:9: note: candidate is: 'int A::getHoge(int)' int getHoge(std::unique_ptr<B::Hoge> hoge); ^~~~~~~ test.cpp:7:7: note: 'class A' defined here class A
maisumakun

2019/08/10 04:46

やっぱりBを先に定義するほかないかもしれません。
maisumakun

2019/08/10 05:02

(Bfile.hppで#include "Afile.hpp"を外して、Bが先に定義されるように強制してみてはどうでしょうか)
fdaskjlfda

2019/08/10 05:08

試してみることにします! ありがとうございます!
fdaskjlfda

2019/08/11 06:11

簡易版でテストしてみたところ、うまくいきました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問