#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 three values of any type:
template<typename T>
T max (T a, T b, T c)
{
return max (max(a,b), c); // uses the template version even for ints
} //because the following declaration comes
// too late:
// maximum of two int values:
int max (int a, int b)
{
std::cout << "max(int,int) \n";
return b < a ? a : b;
}
int main()
{
::max(47,11,33); // OOPS: uses max<T>() instead of max(int,int)
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gbWF4aW11bSBvZiB0d28gdmFsdWVzIG9mIGFueSB0eXBlOgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpUIG1heCAoVCBhLCBUIGIpCnsKICAgIHN0ZDo6Y291dCA8PCAibWF4PFQ+KCkgXG4iOwogICAgcmV0dXJuIGIgPCBhID8gYSA6IGI7Cn0KCi8vIG1heGltdW0gb2YgdGhyZWUgdmFsdWVzIG9mIGFueSB0eXBlOgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpUIG1heCAoVCBhLCBUIGIsIFQgYykKewogICAgcmV0dXJuIG1heCAobWF4KGEsYiksIGMpOyAvLyB1c2VzIHRoZSB0ZW1wbGF0ZSB2ZXJzaW9uIGV2ZW4gZm9yIGludHMKfSAvL2JlY2F1c2UgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBjb21lcwovLyB0b28gbGF0ZToKCi8vIG1heGltdW0gb2YgdHdvIGludCB2YWx1ZXM6CmludCBtYXggKGludCBhLCBpbnQgYikKewogICAgc3RkOjpjb3V0IDw8ICJtYXgoaW50LGludCkgXG4iOwogICAgcmV0dXJuIGIgPCBhID8gYSA6IGI7Cn0KCmludCBtYWluKCkKewogICAgOjptYXgoNDcsMTEsMzMpOyAvLyBPT1BTOiB1c2VzIG1heDxUPigpIGluc3RlYWQgb2YgbWF4KGludCxpbnQpCn0=