
  class dummy_argument {};
  dummy_argument dummy_x;




class null_archetype {
private:
  null_archetype() {};
  null_archetype(const null_archetype &) {};
  null_archetype &operator=(const null_archetype &) {};
public:
  null_archetype(dummy_argument ) {};
} ;

struct boolean_archetype  {
  operator const bool() const {return true;}
};

class comparable_archetype: public null_archetype {
public:
  comparable_archetype(dummy_argument  x): null_archetype(x){};
};

boolean_archetype operator<(const comparable_archetype &,
			     const comparable_archetype &){
    return boolean_archetype();
};

boolean_archetype  operator>(const comparable_archetype &,
				   const comparable_archetype &){
    return boolean_archetype();
};


template<typename T> const T &max(const T &a,const T &b) {return (a>b)?a:b;}
template<typename T> T cmax( T a,T b) {return (a>b)?a:b;}

main() {
comparable_archetype ca(dummy_x);
 max(ca,ca);
 //cmax(ca,ca);
} 