Рассмотрим этот код:
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: ошибка: 'int foo:: bar (A:: B &)' должен иметь был объявлен внутри 'foo'
Но я не могу объявить:
namespace foo
{
int bar( A::B& );
}
перед определением класса A, поскольку A:: B не был объявлен. И я не могу объявить "класс A:: B", очевидно, объявить класс BI должен дать определение класса A, и насколько я знаю, объявления "friend" должны быть внутри определения класса A.
Что странно для меня, если я беру функцию "bar()" из пространства имен foo, все работает нормально. Мне кажется нелогичным то, что наличие функции внутри пространства имен или внутри пространства имен изменит, будет ли компилятор принимать декларацию функции друга в классе.
Знает ли кто-нибудь о том, как правильно структурировать все объявления и т.д., чтобы заставить это работать?