В C ++ 03 вам не разрешается объявлять дружбу с аргументом шаблона.
§7.1.5.3 / 2
[...] Если идентификатор преобразуется в typedef-имя или шаблонный тип-параметр, то разработанный тип-спецификатор неверен. [Примечание: это подразумевает, что в шаблоне класса с параметром типа шаблона T объявление
friend class T;
плохо сформирован. ]
В C ++ 11 произошли некоторые изменения в этом отношении, но это немного странно. friend class T;
по-прежнему плохо информирован, но friend T
разрешено. Цитата может быть найдена в том же пункте:
§7.1.5.3 / 2
[...] [Примечание: это означает, что в шаблоне класса с параметром типа шаблона T объявление
friend class T;
плохо сформирован. Тем не менее, аналогичные декларации друг T; разрешено (11.3). - конец примечания]
Примечания не являются нормативными, но они указывают на смысл норм, которые его окружают. Мне не удалось найти конкретное предложение, которое делает примечание правильным, но я предполагаю, что по крайней мере, намерение состоит в том, что это должно быть разрешено.