Объявление функции как встроенного друга в другом пространстве имен - PullRequest
1 голос
/ 05 января 2011

У меня есть класс, объявленный так:

namespace nsp1
{

 class A
 {
  public :
   inline friend void DoSomething();

  private :
   A();

   int a;
 };

}

Таким образом, функция DoSomething() будет в пространстве имен nsp1.Есть ли способ объявить эту функцию, чтобы она была встроена в список друзей и вне пространства имен?

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Вот решение:

 namespace nsp1
{
    class A;
}

inline void DoSomething(const nsp1::A & a);
 namespace nsp1
{

 class A
 {
  public :
   inline friend void ::DoSomething(const nsp1::A & a);

  private :
   A();

   int a;
 };

}

inline void DoSomething(const nsp1::A & a)
{
     std::cout<<a.a<<std::endl;//a.a is private!
}
2 голосов
/ 05 января 2011

Невозможно сделать это за один раз.Сначала необходимо объявить пространство имен и функцию, затем определить класс, который поддерживает функцию, а затем определить функцию.

namespace nsp2
{
   void DoSomething();
}

namespace nsp1
{
   class A
   {
   public :
      friend void nsp2::DoSomething();

   private :
      A();

      int a;
   };
}

namespace nsp2
{
   inline void DoSomething()
   {
      nsp1::A a;
      a.a = 42;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...