#include <iostream>
// maximum of two values of any type:
template<typename T>
T max (T a, T b)
{
std::cout << "max<T>()\n";
return b < a ? a : b;
}
// maximum of two int values:
int max(int a, int b)
{
std::cout << "max(int,int) \n";
return b < a ? a : b;
}
// maximum of three values of any type:
template<typename T>
T max (T a, T b, T c)
{
return max (max(a,b), c);
}
struct S {};
S max(S, S)
{
std::cout << "max(S,S)\n";
return {};
}
int main()
{
::max(47, 11, 33);
::max(S{}, S{}, S{});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gbWF4aW11bSBvZiB0d28gdmFsdWVzIG9mIGFueSB0eXBlOgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpUIG1heCAoVCBhLCBUIGIpCnsKICAgIHN0ZDo6Y291dCA8PCAibWF4PFQ+KClcbiI7CiAgICByZXR1cm4gYiA8IGEgPyBhIDogYjsKfQoKLy8gbWF4aW11bSBvZiB0d28gaW50IHZhbHVlczoKaW50IG1heChpbnQgYSwgaW50IGIpCnsKICAgIHN0ZDo6Y291dCA8PCAibWF4KGludCxpbnQpIFxuIjsKICAgIHJldHVybiBiIDwgYSA/IGEgOiBiOwp9CgovLyBtYXhpbXVtIG9mIHRocmVlIHZhbHVlcyBvZiBhbnkgdHlwZToKdGVtcGxhdGU8dHlwZW5hbWUgVD4KVCBtYXggKFQgYSwgVCBiLCBUIGMpCnsKICAgIHJldHVybiBtYXggKG1heChhLGIpLCBjKTsKfQoKc3RydWN0IFMge307CgpTIG1heChTLCBTKQp7CglzdGQ6OmNvdXQgPDwgIm1heChTLFMpXG4iOwoJcmV0dXJuIHt9Owp9CgoKCmludCBtYWluKCkKewogICAgOjptYXgoNDcsIDExLCAzMyk7CiAgICA6Om1heChTe30sIFN7fSwgU3t9KTsKfQ==