Вы должны объявить B::C
перед использованием. Следующее может работать.
Обновление: Игнорирование пригодной для использования демонстрации по запросу, вот способ структурирования этого (за исключением определений функций-членов), который мог бы работать, но имейте в виду, что все является приватным в его нынешнем виде.
class A;
class B
{
int geti(A * ap);
public:
class C
{
int geti(A * ap);
};
};
class A
{
friend class B; // fine
friend class B::C; // fine too
int i;
};
Затем определите функции получения в другом месте:
int B::geti(A * ap) { ... }
int B::C::geti(A * ap) { ... }
Альтернатива: заранее объявить вложенный класс B::C
и сохранить одно внешнее определение:
class A;
class B
{
int geti(const A * ap) const; // we cannot use A yet!
public:
class C;
};
class A
{
friend class B; // fine
friend class B::C; // fine too
int i;
};
int B::geti(const A * ap) const { return ap->i; }
class B::C
{
inline int geti(const A * ap) const { return ap->i; }
};