template<class T, class Y>
std::ostream& operator<<(std::ostream& out,const External::Internal<T, Y>&)
^^^^^^^^^^ ^^^^^^
{
}
И обязательно объявите эту функцию friend
, потому что Internal
является приватным в External
Обновление:
вот как вы объявляете друга. В вашем определении класса напишите:
template<class T, class Y>
friend std::ostream& operator <<(std::ostream& out, const External::Internal<T,Y>&)
Поскольку объявление друга является декларацией, это решит проблему с вашим предварительным объявлением.
Обновление: для решения круговой зависимости:
Первый форвард-объявить internal
template<class T, class Y>
class Internal;
тогда объявите друга.
Тогда остальная часть вашего класса должна работать.