• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フレンド宣言のスコープがわかりません。)

フレンド宣言のスコープについて

このQ&Aのポイント
  • フレンド宣言のスコープについての疑問
  • C++プライマー第4版で紹介されているフレンド宣言のスコープについての説明
  • gccでのコンパイルエラーについての疑問

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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の中には直接アクセスできないのだから、外部に宣言がないとエラーになるのは自明です。 書籍とかに書かれてるコードは(著者にとって)自明な部分は省かれてることがままありますから、それをそのままコンパイルして通るという保証はありません。(ま、思い違いとかチェック漏れの場合もあるでしょういけど)

noname#114276
質問者

お礼

回答ありがとうございます。 gccが正しいとよくわかりました。 magicalpassさん、ありがとうございます。

関連するQ&A