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

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  soubor: friend5.cpp
  4. //  autor: Jaroslav Franek
  5. //  copyright? proc ne: (c) 2001 Jaroslav Franek
  6. //
  7. //  Spratelene funkce, dil 4 - co je jeste dobre vedet 
  8. //                             a navic jeste podivna chyba v C++Builderu
  9. //
  10. ////////////////////////////////////////////////////////////////////////////
  11. //---------------------------------------------------------------------------
  12.  
  13. #pragma hdrstop
  14. #include <iostream>
  15.  
  16. //---------------------------------------------------------------------------
  17.  
  18. namespace N
  19. {
  20. class A;
  21. }
  22.  
  23. template <class T> void f(T &);
  24. void g(N::A &);  // alias ::g
  25.  
  26. namespace N
  27. {
  28.    template <class T> void h(T);
  29.  
  30.    class A
  31.    {
  32.       // ...
  33.       friend void f<>(A &);  // nelze
  34.       friend void h<>(A &);  // OK, N::h
  35.       friend void g(A &); // OK,
  36.          // deklarace funkce N::g, nikoli ::g
  37.    private:
  38.       static const int priv_data = 2603194; // "2603194, jste propusten..." :-)
  39.    };
  40.  
  41. //   const int A::priv_data;
  42.  
  43.    void g(A & a)
  44.    {
  45.       std::cout << "\nja jsem N::g a magicka hodnota je "
  46.                 << a.priv_data;
  47.    }
  48. }
  49.  
  50. void g(N::A & a)  // alias ::g
  51. {
  52. //      std::cout << "\nja jsem ::g(int) a magicka hodnota je "
  53. //                << a.priv_data;
  54.    std::cout << "\nja jsem ::g a magickou hodnotu neznam";
  55. }
  56.  
  57. template <class T> void f(T & x)
  58. {
  59.    std::cout << "\nja jsem sablonova f<" << typeid(T).name()
  60.              << "> a magicka hodnota je " << x.priv_data;  // neprojde (#)
  61. }
  62.  
  63. const int fuj = N::A::priv_data;  // ?? jak je to mozny (kvalifikace obejde pristupova prava)
  64.  
  65. #pragma argsused
  66. int main(int argc, char* argv[])
  67. {
  68.    N::A a;
  69.  
  70.    ::g(a);   // "ne"pritel
  71.    N::g(a);  // pritel
  72.  
  73. //   f(a);  // neprojde link, odkazuje na N::f a ta neni definovana
  74.  
  75. //   ::f(a);  // neprojde kompilace, globalni f neni pritelem (#)
  76.  
  77.    // to jsem z toho jelen...(uz ne, zase dalsi bug v Builderu :-)
  78.    // privatni staticka data nejsou chranena pristupovymi pravy, ci co?
  79.    // (kvalifikace obejde pristupova prava)
  80.    std::cout << "\ntohle jsem teda necekal, magicka hodnota je "
  81.              << N::A::priv_data
  82.              << "\n a jeste jednou " << fuj;
  83.  
  84.    return 0;
  85. }
  86. //---------------------------------------------------------------------------
  87.  
  88.