Вы не можете получить доступ к локальному классу вне его границ, даже если вы дружите, потому что The name of a local class is local to its enclosing scope
- §9.8 / 1.
Однако, если вы просто хотите получить его для компиляции, явно скажите ему, что он выглядит в глобальной области видимости ...
friend void ::bar();
* Это исправляет это в VS, но не в GCC по какой-то причине
§11.3 / 11 (спасибо, Джрок)
Если объявление друга появляется в локальном классе (9.8), а указанное имя является неквалифицированным именем,
объявление ищется без учета областей, которые находятся за пределами самой внутренней охватывающей области, не относящейся к классу.