私の理解では、この例のように、指定子が使用されたfriend
場合、宣言はクラスの前方宣言としても機能する可能性があります。class
class A
{
friend class B;
B* b;
};
class B {};
int main() {}
ただし、g ++(4.6.3および4.7.0)では次のエラーが発生します(g ++-4.7は拡張フレンド宣言をサポートしている必要があります)。これは前方宣言なしで予期されます。
main.cpp:6:2:エラー:「B」はタイプに名前を付けていません
friend class B;
が前方宣言として機能するという私の期待を確認するために、私はこの答えとこの答えを見つけましたが、どちらも決定的ではなかった(または少なくともそれらから多くを結論付けることができなかった)ので、c++を調べようとしました11標準であり、この例が見つかりました:
class X2 {
friend Ct; // OK: class C is a friend
friend D; // error: no type-name D in scope
friend class D; // OK: elaborated-type-specifier declares new class
}
3番目の宣言を読んだことに基づいて、私は新しいクラスを宣言する精巧な型指定子friend class B
である必要があります。
私は公式の標準的な言い回しを理解し始めたばかりなので、何かが欠けているに違いありません。私は何を誤解していますか?