Это зависит от того, что именно вы пытаетесь достичь.Вы можете подружиться с одним экземпляром шаблона или подружиться с всеми экземплярами.Наконец, вы, возможно, на самом деле не хотите подружиться с шаблоном, а просто с не шаблонной функцией, которая автоматически генерируется компилятором при создании экземпляра шаблона вашего класса ...
Поддержка всего шаблона:
template <typename T>
class MyClass {
template <typename U>
friend MyClass<U> f();
};
Поддержка конкретного экземпляра (т. Е. Предоставление f<int>
доступа к MyClass<int>
, но не к MyClass<double>
):
// Forward declarations
template <typename T>
class MyClass;
template <typename T>
MyClass<T> f();
// Definition of class template
template <typename T>
class MyClass {
friend MyClass<T> f<T>();
};
// Definition of friend function
template <typename T>
MyClass<T> f() { ... }
Автоматическое создание экземпляра дружественной не шаблонной функции:
template <typename T>
class MyClass {
friend MyClass<T> f() { ... } // define inline
};
Я бы порекомендовал вам использовать последнее, если только функция не параметризована с другими параметрами шаблона, чем T
для MyClass<T>
.
Рекомендуем прочитать: перегрузка оператора друга << для класса шаблона </a>