Функция Friend не может получить доступ к закрытой функции, если класс находится в пространстве имен - PullRequest
7 голосов
/ 12 июля 2010

У меня есть класс внутри пространства имен, и этот класс содержит приватную функцию. И есть глобальная функция. Я хочу, чтобы эта глобальная функция была другом моего класса, который находится внутри пространства имен. Но когда я делаю это как друг, компилятор думает, что функция не является глобальной, и она находится внутри этого пространства имен. Поэтому, если я пытаюсь получить доступ к закрытой функции-члену с помощью глобальной функции, она не работает, тогда как, если я определяю функцию с тем же именем в этом пространстве имен, она работает. Ниже приведен код, который вы видите.

#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 голосов
/ 12 июля 2010

Вам необходимо использовать оператор глобальной области действия ::.

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
}
4 голосов
/ 12 июля 2010

Функция fun () находится в глобальном пространстве имен. Вам нужен прототип:

void fun();

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

}

void fun()
{
    Nayan::CA::funCA();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...