不理解。。。
回忆一下,当一个类声明友元函数的时候,函数的声明不必是可见的。如果不存在可见的声明,那么,友元声明具有将该函数或类的声明放入外围作用域的结果。如果类在命名空间内定义,则没有另外声明的友元函数在同一命名空间中声明。
namespace A{
class C{
friend void f(const C&); //make f a member of namespace A
}
}
因为该友元接受类类型实参并与类隐式声明在同一命名空间中,所以使用它时可以无须使用显式命名空间限定符:
// f2 defined at golbal scope
Void f2()
{
A::C cobj;
f(cobj);//calls A::f
}
如题。。。这内容要怎么理解。。。而且,最后一句话:因为该友元接受类类型实参并与类隐式声明在同一命名空间中,所以使用它时可以无须使用显式命名空间限定符,这句话又要怎么理解。。。
[解决办法]
这段话是哪儿的?说的这么晦涩……
上面这个例子应该是说明koenig查找规则的。也就是:C++标准规定,对于没有明确指定名字空间的情形,可以考虑其他名字空间,特别是正被传给函数的参数的类型所在的名字空间。
在f2函数中,它会调用f函数,但是它本身的作用域没有这个函数,而且函数f也没有指定名字空间,而编译器看到f函数传入参数的类型是在名字空间A中,所以根据标准,编译器应该到名字空间A中继续查找是否存在函数f,这个时候找到了,于是编译器就通过了关于函数f的编译