В чем разница между синтаксисом "friend struct A" и "friend A"?
в чем разница между:
struct A;
struct B { friend struct A; };
и
struct A;
struct B { friend A; };
что значит пропустить struct
во второй части?
1 ответов
разница в том, что если вы пишите friend A;
, A
должно быть известным именем типа, то есть оно должно быть объявлено ранее.
если вы пишите friend struct A;
, это само по себе заявление A
, поэтому не требуется предварительного объявления:
struct B { friend struct A; }; // OK
есть правда несколько тонкостей. Например, friend class/struct A
объявляет класс A
в самом внутреннем пространстве имен класса B
(спасибо капитан 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; };