home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 October
/
Chip_2001-10_cd1.bin
/
chplus
/
cpp
/
friend2.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2001-08-02
|
3KB
|
111 lines
////////////////////////////////////////////////////////////////////////////
//
// soubor: friend2.cpp
// autor: Jaroslav Franek
// copyright? proc ne: (c) 2001 Jaroslav Franek
//
// Spratelene funkce, dil 1
//
////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
#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)
template <class T> void h(T); // (4)
void h(); // (5)
////////////////////////////////////////////////////////////////////////////
//
// class Trida<T>
//
////////////////////////////////////////////////////////////////////////////
template <class T> class Trida
{
// sp°ßtelene funkce f
friend void f<T>(Trida<T> &); // (d)
// friend Trida<T> ::f<T>(Trida<T> &); // (e)
// sp°ßtelene funkce g
friend void g<T>(Trida<T> &); // (h)
// friend Trida<T> ::g<T>(Trida<T> &); // (i)
// ten zbytek
friend void h(); // (l)
template <class U> friend void h(U); // (m)
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;
}
// tato funkce neni pritel
void f(Trida<int> & x) // (2)
{
std::cout << "\nja jsem nesablonova f"
" a magicke cislo neznam";
}
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;
}
template <class T> void h(T) // (4)
{
std::cout << "\nja jsem sablonova h<" << typeid(T).name() << ">"
" a magicke cislo je " << Trida<T>::priv_data;
}
void h() // (5)
{
std::cout << "\nja jsem nesablonova h" // treba T==int
" a magicke cislo je " << Trida<int>::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
f(a_int); // jinak se bude volat radova funkce
f(a_double); // tady je to jednoznacne
g(a_int); // stejne tak tady
g(a_double);
h<char>('0');
h();
return 0;
}
//---------------------------------------------------------------------------