Как указано в некоторых комментариях ниже вопроса, кажется, что код в вопросе работает со мной (Linux-Ubuntu-16.04, gcc версия 5.4.0), при условии, что класс друга был заранее объявлен .
В поисках ответа я наткнулся на этот пост , который объясняет правильную технику создания класса друзей в глобальном пространстве имен и объясняет, почему его нужно объявить так, как он это делает. Это хорошая тема, потому что она ссылается на стандарт.
Как указывалось ранее, класс глобального пространства имен должен быть объявлен вперед , прежде чем его можно будет использовать в качестве класса друга для класса в пространстве имен.