Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

szablony klas jak przeciazyć operator<<

Ostatnio zmodyfikowano 2014-01-16 13:21
Autor Wiadomość
dziabongo
Temat założony przez niniejszego użytkownika
szablony klas jak przeciazyć operator<<
» 2014-01-16 12:46:42
Witam!
Potrzebuje pomocy z jedną rzeczą, chodzi o przeciążenie operatora<< w szablonie klasy

mam taką klase

C/C++
template < typename any >
class szablon_base
{
private:
    any * m_tab;
    int m_rozmiar;
public:
    szablon_base() { m_tab = NULL; m_rozmiar = 0; };
    szablon_base( int rozmiar );
    ~szablon_base() { delete[] m_tab; };
   
    bool powieksz( int powiekszenie );
    bool pomniejsz( int pomniejszenie );
    void wypelnij( any x, int start = 0 );
};
i tak jedno rozwiązanie problemu znalazłem na necie a jedno w książce ale tego z neta nie rozumiem, i tu bym prosił o małe wyjaśnienie.
żeby mi to zadziałało

muszę przed szablonem klasy zrobić takie coś 
C/C++
template < typename any > class szablon_base;
template < typename any > std::ostream & operator <<( std::ostream & os, const szablon_base < any > & x );
a wewnątrz klasy przyjaźń wygląda tak
C/C++
friend std::ostream & operator << <>( std::ostream & os, const szablon_base < any > & x );
no i sama funkcja
C/C++
template < typename any > std::ostream & operator <<( std::ostream & os, const szablon_base < any > & x )
{
    for( int i = 0; i < x.m_rozmiar; i++ )
         os << x.m_tab[ i ] << " ";
   
    os << std::endl;
   
    return os;
}

a to co jest w książce wiąże się z pisaniem funkcji dla każdego typu
std::ostream & operator<<(std::ostream & os, const szablon_base<int> & x) i tak osobno dla double itd...
może mi ktoś to krótko wyjaśnić o co w tym chodzi i po co jest ten zapis <> po słowie operator<<
proszę o pomoc
P-102299
Monika90
» 2014-01-16 13:21:25
Bez <> po nazwie funkcji deklaracja friend nie deklaruje szablonu funkcji, ale zwykłą funkcję. Dlatego potem musisz ją definiować osobno dla każdego typu z którym chcesz jej używać.

Oprócz tego sposobu z <> można też zwyczajnie zdefiniować funkcję zaprzyjaźnioną wewnątrz szablonu klasy
C/C++
template < typename any >
class szablon_base
{
    friend std::ostream & operator <<( std::ostream & os, const szablon_base & x )
    {
        for( int i = 0; i < x.m_rozmiar; i++ )
             os << x.m_tab[ i ] << " ";
       
        return os << std::endl;
    }
};
P-102300
« 1 »
  Strona 1 z 1