Rozwiązanie od @goostaw jest błędne - jak tylko przyjdzie druga klasa w programie, którą zechcesz wypisać dojdzie do konfliktu. Konflikt ten można rozwiązać za pomocą SFINAE, ale to nie jest potrzebne, skoro są fundamentalne problemy w definicji klasy: zadeklarowana funkcja ostream & operator<<(ostream& os, MyStruct<T>&ref)
nie jest szablonem, a jej "implementacja" już tak. Rozwiązania (od razu dodaję const
do parametru, żeby było idiomatycznie):
Użyj globalnego op<<:
template <typename T>
struct MyStruct
{
T skladowa;
MyStruct(T s) : skladowa(s) {};
};
template <typename T>
ostream & operator<<(ostream& os, MyStruct<T> const& ref) {
os << ref.skladowa;
return os;
}
Zdefiniuj funkcję inline
template <typename T>
struct MyStruct
{
T skladowa;
MyStruct(T s) : skladowa(s) {};
friend ostream & operator<<(ostream& os, MyStruct<T>const& ref) {
os << ref.skladowa;
return os;
}
};
Zadeklaruj szablon, skoro implementacją jest szablon:
template <typename T>
struct MyStruct
{
T skladowa;
MyStruct(T s) : skladowa(s) {};
template<typename U> friend
ostream & operator<<(ostream& os, MyStruct<U>const& ref);
};
template <typename T>
ostream & operator<<(ostream& os, MyStruct<T> const& ref) {
os << ref.skladowa;
return os;
}