Как я могу объявить функцию друга в пространстве имен, которое принимает внутренний класс в качестве параметра?

Рассмотрим этот код:

namespace foo {}

class A
{
   class B
   {
   };

   friend int foo::bar( B& );
};

namespace foo
{
   int bar( A::B& )
   {
   }
}

G ++ 4.4.3 сообщает мне:

friendfun-innerclass.cpp: 21: error: 'int foo :: bar (A :: B &)' должно быть объявлено внутри 'foo'

Но я не могу declare:

namespace foo
{
   int bar( A::B& );
}

перед определением класса A, потому что A :: B не был объявлен. И я не могу явно объявить "класс A :: B", чтобы объявить класс BI, нужно дать определение класса A, и, насколько я знаю, объявления "друга" должны находиться внутри определения класса A.

​​Что мне странно, так это то, что если я беру функцию bar () из пространства имен foo, все работает нормально. Мне кажется нелогичным, что наличие функции внутри пространства имен или нет внутри пространства имен меняет, примет ли компилятор объявление функции друга в классе.

Кто-нибудь знает, как правильно структурировать все объявления и тому подобное, чтобы заставить это работать?

12
задан Jay Walker 11 October 2011 в 15:20
поделиться