做的有什么区别:
struct A;
struct B { friend struct A; };
Run Code Online (Sandbox Code Playgroud)
和
struct A;
struct B { friend A; };
Run Code Online (Sandbox Code Playgroud)
struct在第二部分中省略了什么意思?
Ant*_*vin 15
不同的是,如果你写friend A;,A必须是一个已知的类型名称,即它必须在之前声明.
如果你写friend struct A;,这本身就是一个声明A,因此不需要事先声明:
struct B { friend struct A; }; // OK
Run Code Online (Sandbox Code Playgroud)
但有几个微妙之处.例如,在friend class/struct A类A的最内层封闭命名空间中声明类B(感谢Captain Obvlious):
class A;
namespace N {
class B {
friend A; // ::A is a friend
friend class A; // Declares class N::A despite prior declaration of ::A,
// so ::A is not a friend if previous line is commented
};
}
Run Code Online (Sandbox Code Playgroud)
还有其他几种情况,你只能写friend A:
A 是typedef-name:
class A;
typedef A A_Alias;
struct B {
// friend class A_Alias; - ill-formed
friend A_Alias;
};
Run Code Online (Sandbox Code Playgroud)A 是一个模板参数:
template<typename A>
struct B {
// friend class A; - ill-formed
friend A;
};
Run Code Online (Sandbox Code Playgroud)