home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////////////////////////////
- //
- // soubor: friend5.cpp
- // autor: Jaroslav Franek
- // copyright? proc ne: (c) 2001 Jaroslav Franek
- //
- // Spratelene funkce, dil 4 - co je jeste dobre vedet
- // a navic jeste podivna chyba v C++Builderu
- //
- ////////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------------
-
- #pragma hdrstop
- #include <iostream>
-
- //---------------------------------------------------------------------------
-
- namespace N
- {
- class A;
- }
-
- template <class T> void f(T &);
- void g(N::A &); // alias ::g
-
- namespace N
- {
- template <class T> void h(T);
-
- class A
- {
- // ...
- friend void f<>(A &); // nelze
- friend void h<>(A &); // OK, N::h
- friend void g(A &); // OK,
- // deklarace funkce N::g, nikoli ::g
- private:
- static const int priv_data = 2603194; // "2603194, jste propusten..." :-)
- };
-
- // const int A::priv_data;
-
- void g(A & a)
- {
- std::cout << "\nja jsem N::g a magicka hodnota je "
- << a.priv_data;
- }
- }
-
- void g(N::A & a) // alias ::g
- {
- // std::cout << "\nja jsem ::g(int) a magicka hodnota je "
- // << a.priv_data;
- std::cout << "\nja jsem ::g a magickou hodnotu neznam";
- }
-
- template <class T> void f(T & x)
- {
- std::cout << "\nja jsem sablonova f<" << typeid(T).name()
- << "> a magicka hodnota je " << x.priv_data; // neprojde (#)
- }
-
- const int fuj = N::A::priv_data; // ?? jak je to mozny (kvalifikace obejde pristupova prava)
-
- #pragma argsused
- int main(int argc, char* argv[])
- {
- N::A a;
-
- ::g(a); // "ne"pritel
- N::g(a); // pritel
-
- // f(a); // neprojde link, odkazuje na N::f a ta neni definovana
-
- // ::f(a); // neprojde kompilace, globalni f neni pritelem (#)
-
- // to jsem z toho jelen...(uz ne, zase dalsi bug v Builderu :-)
- // privatni staticka data nejsou chranena pristupovymi pravy, ci co?
- // (kvalifikace obejde pristupova prava)
- std::cout << "\ntohle jsem teda necekal, magicka hodnota je "
- << N::A::priv_data
- << "\n a jeste jednou " << fuj;
-
- return 0;
- }
- //---------------------------------------------------------------------------
-
-