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

You need to use the global scope operator ::.

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

The fun() function is in the global namespace. You need a prototype:

void fun();

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

}

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