Функция друга не может получить доступ к закрытой функции, если класс находится под пространством имен

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

#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;
}

Я также пытался подружиться как друг пусто:: забава (); И это также не помогает.

7
задан Aquarius_Girl 12 February 2013 в 10:41
поделиться

2 ответа

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

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
}
17
ответ дан 6 December 2019 в 08:41
поделиться

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

void fun();

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

}

void fun()
{
    Nayan::CA::funCA();
}
4
ответ дан 6 December 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: