Programowanie w języku C/C++ » FAQ

Jak przeciążyć operator strumienia w klasie szablonowej

Spis treści

          1 Pierwszy przykład
          2 Drugi przykład
          3 Komentarz


Pierwszy przykład


źródło: http://forum.4programmers.net/viewtopic.php?p=312426#id312426

#include <iostream>
using namespace std;
 
    // deklaracja szablonu klasy
template <class Tp> class C; 
    // deklaracja szablonu operatora <<
template <class Tp> ostream& operator<< (ostream &, const C<Tp> &); 
 
    // deklaracja klasy
template <class Tp>
class C
{
public:
   Tp war;
   friend ostream& operator<< <> (ostream &, const C<Tp> &); // Uwazaj na te nawiasy <>  !!
};
 
template <class Tp> ostream& operator<< (ostream &os, const C<Tp> &c) // tutaj juz tych nawiasow nie ma! Nie ma też słówka friend
{
   os << c.war;
   return os;
}
int main()
{
   C<int> zmienna;
   zmienna.war = 5;
   cout << zmienna;
}


Drugi przykład


źródło: http://forum.4programmers.net/viewtopic.php?p=312441#id312441

#include <iostream>
#include <sstream>
#include <cstring>
 
using namespace std;
 
    // konieczne deklaracja szablonów!
template <class T, int size> class IntArray;
template <class T, int size> ostream& operator<< (ostream& os, const IntArray<T, size>& ia);
template <class T, int size> istream& operator>> (istream& is, IntArray<T, size>& ia);
 
    // deklaracja klasy
template <class T, int size>
class IntArray
{
      T i[size];
public:
       IntArray() { memset(i, 0, size * sizeof(T));}
       T& operator[](int x) { return i[x]; }
 
       friend ostream& operator<< <>(ostream& os, const IntArray<T, size>& ia);
       friend istream& operator>> <>(istream& is, IntArray<T, size>& ia);
};
 
 
template <class T, int size>
ostream& operator<<(ostream& os, const IntArray<T, size>& ia)
{
   T i(0);
   for(int j = 0; j < size; j++)
   {
      os << ia.i[j];
      if ( j != size - 1)
      os << ",";
   }
   os << endl;
   return os;
}
 
template <class T, int size>
istream& operator>>(istream& is, IntArray<T, size>& ia)
{
   for(int j = 0; j < size; j++) is >> ia.i[j];
   return is;
}
 
int main()
{
    stringstream input("47 34 56 92 103");
    IntArray<int, 5> I;
    input >> I;
    I[4] = -1;
    cout << I;
    system("pause");
}



Komentarz


w/w kody działają bez problemu w Code::Blocks (GCC, MinGW) oraz BCB 6, natomiast w VC++ 6 potrzebna jest drobna zmiana (usunięcie ostrych nawiasów)
    friend ostream& operator<< <> (ostream &, const C<Tp> &);
na
    friend ostream& operator<< (ostream &, const C<Tp> &);

4 komentarze

rativel 2008-01-26 22:48

w Dev-C++ jak i w VC++2005 dziala tez wersja (i w devie tylko ta dziala):

template <class T> friend ostream& operator<< (ostream &, const C<T> &);

z tym ze parametr w klasie musi byc inny niz parametr w funkcji (chodzi o <class T>)

DzieX 2006-07-18 09:47

Bardzo dobrze, że to tutaj dodałeś, bo z tymi funkcjami zaprzyjaźnionymi to zamota jest przy szablonach :)

P.S. W VC++ 8.0 (2005) już się nie pluje o "<>"

AklimX 2006-07-18 00:57

:) niom, dla Ciebie nawet bardzo

Pituch 2006-07-17 23:43

Wyglada tak jakby znajomo :)