命名空间内类的友元函数的定义。 我正在读C++底漆,作者说,
如果类是在命名空间中定义的,则 未申报的朋友 函数在同一命名空间中声明: 这是否意味着我不必在名称空间中再次声明函数f() 当我简单地将命名空间外的函数f()定义为命名空间内类的友元函数的定义。 我正在读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&
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;
}