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.