- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フレンド宣言のスコープがわかりません。)
フレンド宣言のスコープについて
このQ&Aのポイント
- フレンド宣言のスコープについての疑問
- C++プライマー第4版で紹介されているフレンド宣言のスコープについての説明
- gccでのコンパイルエラーについての疑問
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
どう見たってgccの方が正しいに決まってます。 > friend class Y; これはclass Y をclass Xのフレンドだと宣言してるだけで、class Yの実体はありません。 > friend void f() > { std::cout << "f()" << std::endl; } > }; これは確かにフレンド関数f()の実体がここにあるように見えますが、これは単なる関数の処理部の記述をここでしているだけであって、外部から見たf()の宣言がここにあるわけではありません。 そもそもフレンド宣言は外部のclassなり関数からそのclass内メンバへのアクセスを許容する宣言なので、classなり関数の宣言は外部に無くては意味ありません。 class Zの中で使われてるYやf()も、main()の中で使われてるf()も、どちらもclass Xの中には直接アクセスできないのだから、外部に宣言がないとエラーになるのは自明です。 書籍とかに書かれてるコードは(著者にとって)自明な部分は省かれてることがままありますから、それをそのままコンパイルして通るという保証はありません。(ま、思い違いとかチェック漏れの場合もあるでしょういけど)
お礼
回答ありがとうございます。 gccが正しいとよくわかりました。 magicalpassさん、ありがとうございます。