Przeciąż operator strumienia wyjściowego klasy szablonu poza szablonem

Chcę przeciążyć operatora strumienia wyjściowego<< poza definicją klasy szablonu.

Wdrażanie go w klasie szablonów jest w porządku:

template
<typename T,int _MaxSize=10,template <class C> class Policy=NoCheck,typename Container=std::vector<T>>
class MyContainer : public Policy<T>
{
public:
  MyContainer():p(_MaxSize){};
  std::ostream& operator<<(MyContainer<T,_MaxSize,Policy,Container>& obj){ };
private:
  Container p;
};

Ale kiedy próbowałem to zrobić poza klasą szablonu:

template
<typename T,int _MaxSize=10,template <class C> class Policy=NoCheck,typename Container=std::vector<T>>
class MyContainer : public Policy<T>
{
public:
  MyContainer():p(_MaxSize){};
  friend std::ostream& operator<<(std::ostream& out,MyContainer<T,_MaxSize,Policy,Container> obj);
private:
  Container p;
};

template
<typename T,int _MaxSize,template <class C> class Policy,typename Container>
std::ostream& operator<<(std::ostream& out,MyContainer<T,_MaxSize,Policy,Container> obj)
{
};

Kompilator skarży się:

warning: friend declaration ‘std::ostream& operator<<(std::ostream&, MyContainer<T, _MaxSize, Policy, Container>)’ declares a non-template function [-Wnon-template-friend]
tempstruct.cc:39:97: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)

Czy ktoś może podać prosty przykład, w jaki sposób operator strumienia wyjściowego<< zdefiniowane poza klasą szablonu?

W pokrewnych postach, które tutaj znalazłem, wszyscy robią to w klasie szablonów.

questionAnswers(1)

yourAnswerToTheQuestion