命名空间内类的友元函数的定义。 我正在读C++底漆,作者说,

命名空间内类的友元函数的定义。 我正在读C++底漆,作者说,,c++,namespaces,friend,C++,Namespaces,Friend,如果类是在命名空间中定义的,则 未申报的朋友 函数在同一命名空间中声明: 这是否意味着我不必在名称空间中再次声明函数f() 当我简单地将命名空间外的函数f()定义为 void A::f(const C& obj) { std::cout << "f(const C&) " << std::endl; } 有谁能告诉我作者的意思吗?对于一个如下所示的类声明,这里的内容被解释为类成员定义: class A { void f(const C&

如果类是在命名空间中定义的,则 未申报的朋友 函数在同一命名空间中声明:

这是否意味着我不必在名称空间中再次声明函数f()

当我简单地将命名空间外的函数f()定义为

void
A::f(const C& obj)
{
  std::cout << "f(const C&) " << std::endl;
}

有谁能告诉我作者的意思吗?

对于一个如下所示的类声明,这里的内容被解释为类成员定义:

class A {
  void f(const C& obj);
}
您应该这样定义f:

namespace A {
  void f(const C& obj)
  {
    std::cout << "f(const C&) " << std::endl;
  }
}
名称空间A{
无效f(常数C和obj)
{

std::cout作者的意思是,如果没有显式地声明友元函数的名称空间,则友元函数在同一类名称空间中隐式声明

因此
f
需要在命名空间
A

#include <iostream>

namespace A {
  class C {
    friend void f(const C&); // makes f a member of namespace A
    int i;

    public:
      C() : i(42) {}
  };

  void f(const A::C& obj)
  {
    std::cout << "f(const A::C&) " << std::endl;
    std::cout << "obj.i = " << obj.i << std::endl;      // access private member
  }
}

int main()
{
  A::C ac;

  f(ac);
  return 0;
}
标准7.3.1.2/3:

在命名空间中首先声明的每个名称都是该命名空间的成员 非局部类首先声明一个类或函数83)友元类或函数是最内层的成员 封闭名称空间。在名称空间范围中提供匹配声明之前(授予友谊的类声明之前或之后),通过简单的名称查找无法找到朋友的名称。

namespace A {
  void f(const C& obj)
  {
    std::cout << "f(const C&) " << std::endl;
  }
}
#include <iostream>

namespace A {
  class C {
    friend void f(const C&); // makes f a member of namespace A
    int i;

    public:
      C() : i(42) {}
  };

  void f(const A::C& obj)
  {
    std::cout << "f(const A::C&) " << std::endl;
    std::cout << "obj.i = " << obj.i << std::endl;      // access private member
  }
}

int main()
{
  A::C ac;

  f(ac);
  return 0;
}
#include <iostream>

// forward declarations
namespace A { class C; }
namespace B { void f(const A::C&); }

namespace A {
  class C {
    friend void B::f(const C&);
    int i;

  public:
    C() : i(42) {}
  };
}

namespace B {
  void f(const A::C& obj)
  {
    std::cout << "f(const A::C&) " << std::endl;
    std::cout << "obj.i = " << obj.i << std::endl;      // access private member
  }
}

int main()
{
  A::C ac;

  B::f(ac);
  return 0;
}