Ĺadny brzuch
Witam. Mam klasę szablonową A i chciałbym móc wypisywać jej zawartość za pomocą "cout <<". Zrobiłem to tak i nie działa:
#include <iostream> using namespace std; template <class T> class A { public: T a; A(T aa) : a(aa) {} friend ostream &operator<<(ostream &ostr, A a); }; template <class T> ostream &operator<<(ostream &ostr, A<T> aa) { ostr << aa.a; return ostr; } int main() { A<int> aa(10); cout << aa; system("PAUSE"); return 0; }
Nie wiecie dlaczego?
Użytkownik eugeniusz edytował ten post 29 grudzień 2007, 01:01
daltego ze zazwyczaj klasy i funckje (zwlaszcza szablonowe) wczesniej sie deklaruje..
wstaw deklaracje szblonu klasy i funkcji zaprzyjaznione na poczatku kodu..
i przy deklaracji funkji przeciazajacej operator nalezy na koncu jej nazwy dodac "<>" ---> (...)operator<< <>(...)
Po pierwsze podawaj błędy jakie otrzymujesz, a po drugie:
Nic dziwnego, że nie działa. Chcesz zaprzyjaźnić jedną funkcję pod każdą możliwą instancję szablonu. Można tak owszem, ale nie tędy droga gdy chcesz przeciążyć operator wsadzania do strumienia. Tym bardziej, że deklaracja w klasie, jest zupełnie inna niż deklaracja szablonu poniżej :) Rozwiązaniem Twojego problemu jest dodanie szablonu funkcji zaprzyjaźnionej w deklaracji klasy:template <typename T> class A { public: T a; A(T aa) : a(aa) {} template<typename U> friend ostream &operator<<(ostream &ostr, A<U> a); };
btw... Używanie class wewnątrz <> jest wycofywane na rzecz typename.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include <iostream> using namespace std; template <class T> class A { public: T a; A(T aa) : a(aa) {} friend ostream &operator<<(ostream &ostr, A a); }; template <class T> ostream &operator<<(ostream &ostr, A<T> aa) { ostr << aa.a; return ostr; } int main() { A<int> aa(10); cout << aa; system("PAUSE"); return 0; }
Nie wiecie dlaczego?
Użytkownik eugeniusz edytował ten post 29 grudzień 2007, 01:01
daltego ze zazwyczaj klasy i funckje (zwlaszcza szablonowe) wczesniej sie deklaruje..
wstaw deklaracje szblonu klasy i funkcji zaprzyjaznione na poczatku kodu..
i przy deklaracji funkji przeciazajacej operator nalezy na koncu jej nazwy dodac "<>" ---> (...)operator<< <>(...)
Po pierwsze podawaj błędy jakie otrzymujesz, a po drugie:
Nic dziwnego, że nie działa. Chcesz zaprzyjaźnić jedną funkcję pod każdą możliwą instancję szablonu. Można tak owszem, ale nie tędy droga gdy chcesz przeciążyć operator wsadzania do strumienia. Tym bardziej, że deklaracja w klasie, jest zupełnie inna niż deklaracja szablonu poniżej :) Rozwiązaniem Twojego problemu jest dodanie szablonu funkcji zaprzyjaźnionej w deklaracji klasy:template <typename T> class A { public: T a; A(T aa) : a(aa) {} template<typename U> friend ostream &operator<<(ostream &ostr, A<U> a); };
btw... Używanie class wewnątrz <> jest wycofywane na rzecz typename.