#include<iostream> 
#include<complex>
using namespace std;


template<typename T> T max(T a,T b) {return (a>b)?a:b;}; 

class X {
X(const X &){};
public:
  X() {};
};


main() {
cout<<::max<int>(7,5)<<endl;
cout<<::max<double>(3.1415,2.71)<<endl;
cout<<::max<string>("Ania","Basia")<<endl;


cout<<::max(7,5)<<endl;
cout<<::max(3.1415,2.71)<<endl;
cout<<::max("Ania","Basia")<<endl;

complex<double> c1,c2;
//max<complex<double> >(c1,c2);/* brak operatora >  */


X a,b;
//max<X>(a,b); /* brak  knstruktora kopiujÄ?cego */


//cout<<::max(3.14,2)<<endl;
/* bÅ?Ä?d: kompilator nie jest w stanie wydedukowac\ 
   argumentu szablony bo typy argumentow \ 
   (int,double) nie pasuja  do (T,T)  
*/

cout<<::max<int>(3.14,2)<<endl;
 /*podajac argument jawnie wymuszamy sygnature \ 
  int max(int,int) \ 
  a co za tym idzie automatyczna konwersje  \ 
  argumentu 1 do int-a \ 
 */

cout<<::max<double>(3.14,2)<<endl;
/*
 podajac argument jawnie wymuszamy sygnature \ 
 double max(double,double)  \ 
 a co za tym idzie automatyczna konwersje \  
 argumentu 2 do double-a \
*/

 int i;
//cout<<::max<int>(&i,i)<<endl; 
/*bÅ?Ä?d: nie istnieje konwersja z typu int * na int  na X*/

}