Задача 1:
Вы действительно хотите это сделать?Вы хотите A<int>
для доступа B<float>
?Обычно это не так, но если вы действительно хотите:
template <typename U>
friend class A;
Проблема 2:
Проблема в том, что вы не делаете экземпляр шаблона f1
другом, а скорее вы пытаетесь сделать не шаблонную бесплатную функцию f1
, которая займет B<int>
вашего друга.Правильный синтаксис подружиться с конкретным экземпляром является громоздким:
template <typename T> class B;
template <typename T> void f( B<T>& );
template <typename T>
class B {
friend void f<T>( B<T>& );
};
Задача 3:
Сделать все специализации f1
другом (опять же, вы действительно этого хотите?),Вы можете сделать тот же подход, что и для шаблона класса:
template <typename U>
friend void f1( B<U>& );
Подробнее обо всех этих здесь