В C ++ 03 следующее недопустимо, хотя некоторые компиляторы его поддерживают.
template <class T> class X { friend T; };
Легализовано ли это в C ++ 11?(Извините, я не успел прочесть черновик, просто надеясь, что кто-то это знает)
Из раздела §11.3, 3 в N3291:
template <typename T> class R { friend T; }; R<C> rc; // class C is a friend of R<C> R<int> Ri; // OK: "friend int;" is ignored
Так что это допустимо в C ++ 11.
Да, c ++ 0x позволяет параметру шаблона быть друзьями.
Что ж, я случайно вспомнил, что читал его в черновике раньше, но не смог найти ссылку.*
Это недопустимо в простом C ++, но есть простой обходной путь
template <class T> class X { private: class Wrapper { public: typedef T Type; }; friend class Wrapper::Type; };