7

名前空間内にクラスがあり、そのクラスにプライベート関数が含まれています。そして、グローバル機能があります。そのグローバル関数を、名前空間内にあるクラスのフレンドにしたい。しかし、私が友人として作ると、コンパイラは関数がグローバルではなく、その名前空間自体の中にあると考えます。そのため、グローバル関数でプライベート メンバー関数にアクセスしようとしても機能しませんが、その名前空間自体で同じ名前の関数を定義すると機能します。以下は、あなたが見ることができるコードです。

#include <iostream>
#include <conio.h>

namespace Nayan
{
   class CA
   {
   private:
      static void funCA();
      friend void fun();
   };

   void CA::funCA()
   {
      std::cout<<"CA::funCA"<<std::endl;
   }

   void fun()
   {
      Nayan::CA::funCA();
   }

}

void fun()
{
   //Nayan::CA::funCA(); //Can't access private member
}


int main()
{
   Nayan::fun();
   _getch();
   return 0;
}

私も友達として友達を作ろうとしました void ::fun(); また、それは役に立ちません。

4

2 に答える 2

17

グローバルスコープ演算子を使用する必要があります::

void fun();

namespace Nayan
{
    class CA
    {
    private:
        static void funCA();
        friend void fun();
        friend void ::fun();
    };

    void CA::funCA()
    {
        std::cout<<"CA::funCA"<<std::endl;
    }

    void fun()
    {
        Nayan::CA::funCA();
    }

}


void fun()
{
   Nayan::CA::funCA(); //Can access private member
}
于 2010-07-12T17:16:00.087 に答える
4

fun() 関数はグローバル名前空間にあります。プロトタイプが必要です:

void fun();

namespace Nayan
{
    class CA
    {
    private:
        static void funCA() {}
        friend void ::fun();
    };

}

void fun()
{
    Nayan::CA::funCA();
}
于 2010-07-12T17:17:16.287 に答える