В чем разница между синтаксисом "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; };