在不同的命名空间中将函数声明为内联朋友

时间:2011-01-05 08:26:45

标签: c++ namespaces

我有一个像这样声明的类:

namespace nsp1
{

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

  private :
   A();

   int a;
 };

}

像这样,函数DoSomething()将位于命名空间nsp1中。 有没有办法声明这个函数让它既可以在内联朋友也可以在命名空间之外?

2 个答案:

答案 0 :(得分:3)

这是一个解决方案:

 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!
}

答案 1 :(得分:2)

不可能一次性完成。首先需要声明命名空间和函数,然后定义与函数成为联系的类,然后定义函数。

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