2

フレンド関数/クラスの定義を別のクラスに入れることはできますか?私はこのようなものを意味します:

class Foo
{
    friend void foo() {} // 1
    friend class Bar {}; // 2
};

gccはfriend関数をコンパイルしますが、friendクラスをコンパイルできません。

4

4 に答える 4

6

フレンド宣言で関数を定義することができfriend、それは他の方法では取得できない興味深い動作をします(囲み型がテンプレートの場合)。

フレンド宣言でクラスを定義することはできませんfriend。その必要はありません。フルアクセスでインラインで新しいタイプを作成する場合は、ネストされたタイプを作成するだけです。メンバーになると、囲んでいるタイプに完全にアクセスできます。唯一の違いは、タイプが名前空間レベルで見つからないことですが、必要に応じてtypedefを追加できます(または、名前空間レベルでクラスを定義し、クラス内で友情を宣言するだけです)。

class Outer {
   int x;
   class Inner {
      static void f( Outer& o ) { o.x = 5; } // fine
   };
};
于 2012-08-29T16:20:44.100 に答える
3

n3337 11.3 / 2

クラスは、フレンド宣言で定義されてはなりません。[ 例:

class A {
friend class B { }; // error: cannot define class in friend declaration
};

—例を終了]

しかし、あなたは次のようなものを使うことができます

class Foo
{
    friend void foo() {} // 1
    class Bar { };
    friend class Bar; // 2
};
于 2012-08-29T16:11:06.433 に答える
1

欠陥レポート45によると、クラスのプライベートメンバーにアクセスできるネストされたクラスを作成できます。これはあなたが意味したことですか?

「ネストされたクラスはメンバーであるため、他のメンバーと同じアクセス権があります。」

このC++標準の欠陥レポートの前は、ネストされたクラスに特別なアクセス権が与えられていなかったため、これはすべてのコンパイラで機能するとは限りません。

于 2012-08-29T16:18:11.850 に答える
0

コードを次のように変更します:-

class Foo 
{
     friend void foo() {} // 1
     friend class Bar ; // 2 
};
于 2012-08-29T16:12:02.977 に答える