home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / chplus / cpp / friend2.cpp < prev    next >
C/C++ Source or Header  |  2001-08-02  |  3KB  |  111 lines

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  soubor: friend2.cpp
  4. //  autor: Jaroslav Franek
  5. //  copyright? proc ne: (c) 2001 Jaroslav Franek
  6. //
  7. //  Spratelene funkce, dil 1
  8. //
  9. ////////////////////////////////////////////////////////////////////////////
  10. //---------------------------------------------------------------------------
  11.  
  12. #pragma hdrstop
  13. #include <iostream>
  14.  
  15. //---------------------------------------------------------------------------
  16.  
  17. template <class T> class Trida;
  18.  
  19. template <class T> void f(Trida<T> &);  // (1)
  20. void f(Trida<int> &);  // (2)
  21. template <class T> void g(Trida<T> &);  // (3)
  22. template <class T> void h(T); // (4)
  23. void h();  // (5)
  24.  
  25. ////////////////////////////////////////////////////////////////////////////
  26. //
  27. //  class Trida<T>
  28. //
  29. ////////////////////////////////////////////////////////////////////////////
  30.  
  31. template <class T> class Trida
  32. {
  33.    // sp°ßtelene funkce f
  34.    friend void f<T>(Trida<T> &);  // (d)
  35.    // friend Trida<T> ::f<T>(Trida<T> &);  // (e)
  36.  
  37.    // sp°ßtelene funkce g
  38.    friend void g<T>(Trida<T> &);  // (h)
  39.    // friend Trida<T> ::g<T>(Trida<T> &);  // (i)
  40.  
  41.    // ten zbytek
  42.    friend void h();   // (l)
  43.    template <class U> friend void h(U); // (m)
  44.  
  45.    static const int priv_data = 2603194; // "2603194, jste propusten..." :-)
  46. };
  47.  
  48. ////////////////////////////////////////////////////////////////////////////
  49. //
  50. //  definice funkci
  51. //
  52. ////////////////////////////////////////////////////////////////////////////
  53.  
  54. template <class T> void f(Trida<T> & x)  // (1)
  55. {
  56.    std::cout << "\nja jsem sablonova f<" << typeid(T).name() << ">"
  57.                 " a magicke cislo je " << x.priv_data;
  58. }
  59.  
  60. // tato funkce neni pritel
  61. void f(Trida<int> & x)  // (2)
  62. {
  63.    std::cout << "\nja jsem nesablonova f"
  64.                 " a magicke cislo neznam";
  65. }
  66.  
  67.  
  68. template <class T> void g(Trida<T> & x)  // (3)
  69. {
  70.    std::cout << "\nja jsem sablonova g<" << typeid(T).name() << ">"
  71.                 " a magicke cislo je " << x.priv_data;
  72. }
  73.  
  74. template <class T> void h(T) // (4)
  75. {
  76.    std::cout << "\nja jsem sablonova h<" << typeid(T).name() << ">"
  77.                 " a magicke cislo je " << Trida<T>::priv_data;
  78. }
  79.  
  80. void h()  // (5)
  81. {
  82.    std::cout << "\nja jsem nesablonova h"     // treba T==int
  83.                 " a magicke cislo je " << Trida<int>::priv_data;
  84. }
  85.  
  86. ////////////////////////////////////////////////////////////////////////////
  87. //
  88. //  v praxi :
  89. //
  90. ////////////////////////////////////////////////////////////////////////////
  91.  
  92. #pragma argsused
  93. int main(int argc, char* argv[])
  94. {
  95.    Trida<int> a_int;
  96.    Trida<double> a_double;
  97.  
  98.    f<int>(a_int);  // musime rict, ze chceme volat specializaci
  99.    f(a_int);       // jinak se bude volat radova funkce
  100.    f(a_double);    // tady je to jednoznacne
  101.  
  102.    g(a_int);       // stejne tak tady
  103.    g(a_double);
  104.  
  105.    h<char>('0');
  106.    h();
  107.  
  108.    return 0;
  109. }
  110. //---------------------------------------------------------------------------
  111.