Вы передали ему указатель const char *
для сравнения, который будет сравнивать адреса указателей, а не содержимое с '>'.Так как они из разных объектов / строк, у вас нет возможности узнать, кто будет первым или последним в памяти, и он может варьироваться от компиляции к компиляции или даже потенциально запускаться для запуска.
Поскольку у вас былоstd::string
локальная переменная, я предполагаю, что вы намеревались передать это, у которого есть операторы сравнения для сравнения содержимого.Если вы хотите передать строковый литерал как std::string
в такую функцию шаблона, вы должны сделать это явно, например:
Max<std::string>("a", "b"); // K is std::string, so both parameters will use the implicit constructor
Max(std::string("a"), std::string("b")); // Explicitly construct strings
Если вы хотите, чтобы Max
работал с указателями на символы,Вы можете перегрузить или специализировать его, чтобы использовать, скажем, strcmp
, который сравнивает содержимое.
template<class T> T Max(T x, T y)
{
return x > y ? x : y;
}
template<> const char* Max(const char *x, const char *y)
{
return strcmp(x, y) > 0 ? x : y;
}
template<> char* Max(char *x, char *y)
{
return strcmp(x, y) > 0 ? x : y;
}