首页 文章

如果类在命名空间下,则Friend函数无法访问私有函数

提问于
浏览
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();它也没有帮助 .

2 回答

  • 17

    fun()函数位于全局命名空间中 . 你需要一个原型:

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

    您需要使用全局范围运算符 :: .

    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
    }
    

相关问题