home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////////////////////////////
- //
- // soubor: friend2.cpp
- // autor: Jaroslav Franek
- // copyright? proc ne: (c) 2001 Jaroslav Franek
- //
- // Spratelene funkce, dil 1
- //
- ////////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------------
-
- #pragma hdrstop
- #include <iostream>
-
- //---------------------------------------------------------------------------
-
- template <class T> class Trida;
-
- template <class T> void f(Trida<T> &); // (1)
- void f(Trida<int> &); // (2)
- template <class T> void g(Trida<T> &); // (3)
- template <class T> void h(T); // (4)
- void h(); // (5)
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // class Trida<T>
- //
- ////////////////////////////////////////////////////////////////////////////
-
- template <class T> class Trida
- {
- // sp°ßtelene funkce f
- friend void f<T>(Trida<T> &); // (d)
- // friend Trida<T> ::f<T>(Trida<T> &); // (e)
-
- // sp°ßtelene funkce g
- friend void g<T>(Trida<T> &); // (h)
- // friend Trida<T> ::g<T>(Trida<T> &); // (i)
-
- // ten zbytek
- friend void h(); // (l)
- template <class U> friend void h(U); // (m)
-
- static const int priv_data = 2603194; // "2603194, jste propusten..." :-)
- };
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // definice funkci
- //
- ////////////////////////////////////////////////////////////////////////////
-
- template <class T> void f(Trida<T> & x) // (1)
- {
- std::cout << "\nja jsem sablonova f<" << typeid(T).name() << ">"
- " a magicke cislo je " << x.priv_data;
- }
-
- // tato funkce neni pritel
- void f(Trida<int> & x) // (2)
- {
- std::cout << "\nja jsem nesablonova f"
- " a magicke cislo neznam";
- }
-
-
- template <class T> void g(Trida<T> & x) // (3)
- {
- std::cout << "\nja jsem sablonova g<" << typeid(T).name() << ">"
- " a magicke cislo je " << x.priv_data;
- }
-
- template <class T> void h(T) // (4)
- {
- std::cout << "\nja jsem sablonova h<" << typeid(T).name() << ">"
- " a magicke cislo je " << Trida<T>::priv_data;
- }
-
- void h() // (5)
- {
- std::cout << "\nja jsem nesablonova h" // treba T==int
- " a magicke cislo je " << Trida<int>::priv_data;
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // v praxi :
- //
- ////////////////////////////////////////////////////////////////////////////
-
- #pragma argsused
- int main(int argc, char* argv[])
- {
- Trida<int> a_int;
- Trida<double> a_double;
-
- f<int>(a_int); // musime rict, ze chceme volat specializaci
- f(a_int); // jinak se bude volat radova funkce
- f(a_double); // tady je to jednoznacne
-
- g(a_int); // stejne tak tady
- g(a_double);
-
- h<char>('0');
- h();
-
- return 0;
- }
- //---------------------------------------------------------------------------
-