做什么之间有什么区别:
struct A;
struct B { friend struct A; };
和
struct A;
struct B { friend A; };
在第二部分遗漏struct
是什么意思?
答案 0 :(得分:15)
不同之处在于,如果您编写friend A;
,A
必须是已知的类型名称,那就必须在之前声明。
如果你写friend struct A;
,这本身就是A
的声明,因此不需要事先声明:
struct B { friend struct A; }; // OK
但有几个细微之处。例如,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
};
}
还有其他几种情况,只能写friend A
:
A
是typedef-name:
class A;
typedef A A_Alias;
struct B {
// friend class A_Alias; - ill-formed
friend A_Alias;
};
A
是模板参数:
template<typename A>
struct B {
// friend class A; - ill-formed
friend A;
};