簡體   English   中英

如果類在命名空間下,則Friend函數無法訪問私有函數

[英]Friend function cannot access private function if class is under a namespace

我在命名空間內有一個類,該類包含一個私有函數。 並且有一個全球功能。 我希望這個全局函數成為我的類的朋友,它位於命名空間內。 但是當我把它作為朋友時,編譯器認為該函數不是全局的,而是在該命名空間本身內部。 因此,如果我嘗試使用全局函數訪問私有成員函數,它就不起作用,而如果我在該命名空間中定義一個具有相同名稱的函數,它就可以工作。 以下是您可以看到的代碼。

#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(); 它也沒有幫助。

您需要使用全局范圍運算符::

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
}

fun()函數位於全局命名空間中。 你需要一個原型:

void fun();

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

}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM