home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////////////////////////////
- //
- // soubor: friend4.cpp
- // autor: Jaroslav Franek
- // copyright? proc ne: (c) 2001 Jaroslav Franek
- //
- // Spratelene funkce, dil 3
- //
- ////////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------------
-
- #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)
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // class Trida<T>
- //
- ////////////////////////////////////////////////////////////////////////////
-
- template <class T> class Trida
- {
- // sp°ßtelene funkce f
- friend void f(Trida<T> &); // (g)
-
- // sp°ßtelene funkce g
- friend void g(Trida<T> &); // (k)
-
- // data nepristupna zvenku (private)
- static const int priv_data = 2603194; // "2603194, jste propusten..." :-)
- };
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // definice funkci
- //
- ////////////////////////////////////////////////////////////////////////////
-
- // ted to neni pritel
- template <class T> void f(Trida<T> & x) // (1)
- {
- std::cout << "\nja jsem sablonova f<" << typeid(T).name() << ">"
- " a magicke cislo neznam";
- }
-
- // tohle je pritel
- void f(Trida<int> & x) // (2)
- {
- std::cout << "\nja jsem nesablonova f"
- " a magicke cislo je " << x.priv_data;
- }
-
- // a tohle neni pritel
- template <class T> void g(Trida<T> & x) // (3)
- {
- std::cout << "\nja jsem sablonova g<" << typeid(T).name() << ">"
- " a magicke cislo neznam";
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // 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
- // tohle projde, ale f<int> neni pritel
-
- f(a_int); // radova funkce, je pritel, OK
- // f(a_double); // tohle neprojde, neni k dispozici radova funkce
-
- // g(a_int); // tohle neprojde, protoze to neni radova funkce
- // g(a_double); // to same
-
- return 0;
- }
- //---------------------------------------------------------------------------
-
-