если вы объявите это следующим образом, то оно будет работать
struct A {};
struct B : private A {};
struct C : B {
void foo(::A const& a) {}
};
Ошибка, которую вы видите, состоит в том, чтобы разрешить имя, а не получить доступ. :: A говорит, что посмотрите на глобальное пространство имен, а не на мои унаследованные вложенные типы классов. Также помните, что частное наследование просто говорит, что у B есть A, а IMOHO - глупая языковая особенность, которую следует избегать.