Здесь есть две проблемы.В двух других ответах уже описана проблема с вашим третьим вызовом.
Но ваш второй вызов также неверен:
char a = 'A';
char b = 'B';
char c = 'C';
char Cptr = *Max(&a, &b, &c);
Это должно привести к неопределенному поведению, поскольку strcmp
ожидает завершения с нуля.строки, но это не то, что вы вводите в функцию.Скорее, вы передаете указатели на отдельные значения char
, и strcmp
имеет полное право подавить это.В принципе, может случиться что угодно, и что ваш код работает, это просто случайность.
Правильный способ вызвать эту перегрузку - просто передать char
s или передать строки в стиле C:
char C = Max(a, b, c);
// or:
char as[] = "a";
char bs[] = "b";
char cd[] = "c";
char* result = Max(as, bs, cd);
Кроме того, вы можете передать строковые литералы напрямую.
Наконец, заметка о стиле.Ваша char*
специализация может быть значительно сокращена, если вы немного «обманываете» путем преобразования входящих char*
строк в правильные std::string
s и повторного использования универсальной версии Max
:
template<>
char* Max(char* first,char* second,char* third)
{
return Max(string(first), string(second), string(third));
}
(Конечно, это, вероятно, менее эффективно, но в большинстве случаев это может быть безопасно проигнорировано.)
И еще одно замечание: назначение явно просило вас специализировать шаблон функции для char*
, поэтому ваш ответправильный.Однако альтернативой может быть перегрузка функции вместо ее специализации.Для шаблонов функций (в отличие от шаблонов классов) это обычный способ, когда вам не требуется больше аргументов шаблона:
char* Max(char* first,char* second,char* third)
{
return Max(string(first), string(second), string(third));
}
Обратите внимание, что единственное отличие заключается в отсутствии template <>
передзаголовок функции.