home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////////////////////////////
- //
- // soubor: friend3.cpp
- // autor: Jaroslav Franek
- // copyright? proc ne: (c) 2001 Jaroslav Franek
- //
- // Spratelene funkce, dil 2
- //
- ////////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------------
-
- #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> &); // (f)
-
- // sp°ßtelene funkce g
- friend void ::g(Trida<T> &); // (j)
-
- // data nepristupna zvenku (private)
- 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;
- }
-
- // tohle by mel byt pritel tridy Trida<int>
- // ale C++ Builder to nezvladne
- void f(Trida<int> & x) // (2)
- {
- std::cout << "\nja jsem nesablonova f"
- " a magicke cislo je " << x.priv_data;
- }
-
-
- 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;
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // 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 by nemelo projit, protoze pritelem je radova fce
-
- f(a_int); // radova funkce, to by melo byt OK
- f(a_double); // tady je to jednoznacne - specializace sablony
-
- g(a_int); // stejne tak tady
- g(a_double);
-
- return 0;
- }
- //---------------------------------------------------------------------------
-
-