#include template X max(X a, X b) { return a > b ? a : b; } class MyInt { friend std::ostream& operator<<(std::ostream& os, const MyInt& m) { os << m.data; return os; } friend bool operator>(MyInt& mi1, MyInt& mi2) { return mi1.data > mi2.data; } public: MyInt(int i) : data(i) {} private: const int data; }; int main() { std::cout << max(5, 3) << std::endl; std::cout << max('a', 'b') << std::endl; std::cout << max(MyInt(5), MyInt(3)) << std::endl; }