Похоже, на ваш вопрос почти дан ответ, но у вас все еще есть пара нерешенных вопросов ...
std::cout << minimum(2.2, 2) << '\n';
Это не скомпилируется с двумя предоставленными вами шаблонными функциями, так как не существует соответствующей функции для вызова minimum(double, int)
. Это оставляет вам два варианта:
Вы можете изменить свою первую функцию шаблона следующим образом:
template <typename T, typename U>
T minimum(T arg1, U arg2)
{
return arg1 < arg2 ? arg1 : arg2;
}
или
Вы можете изменить свой код, чтобы указать, какую специализацию вызывать:
std::cout << minimum<double>(2.2, 2) << '\n';
Существует также ошибка в вашей специализации const char*
(после устранения синтаксической ошибки), поскольку нулевое возвращаемое значение из strcmp
указывает, что обе строки равны. Следующее утверждение не будет выполнено:
assert(0 == strcmp("aaa", minimum("aaa", "bbb")));
Это можно исправить так:
template <>
const char* minimum<const char*>(const char* arg1, const char* arg2)
{
return strcmp(arg1, arg2) > 0 ? arg2 : arg1;
}