Подтвердить что ты не робот

С++ параметр по умолчанию в шаблоне не разрешен?

В моем коде на С++ я написал вот так:

template <typename T, typename Pred>
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = std::less<T>())
{
    return p(lhs, rhs) ? lhs : rhs;
}

Но это не сработало, когда я назвал BestOfTwo (3, 5). Компилятор сказал мне, что никакой экземпляр перегрузки не совпал. Итак, теперь я должен написать это следующим образом:

template <typename T, typename Pred = std::less<T> >
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = Pred())
{
    return p(lhs, rhs) ? lhs : rhs;
}

И это сработало без ошибок, когда я назвал BestOfTwo (3, 5). Но я думаю, что предыдущий стиль более удобен, и я не понял, где он поступил неправильно. Какие предложения?

4b9b3361

Ответ 1

Верна только вторая версия (если вы не хотите вручную указывать параметр Pred), но только с С++ 11. Уже есть ответ от Angew, который разъясняет, почему первая версия неверна, без указания параметра Pred.

Если вы не можете использовать С++ 11, вы должны написать две перегрузки (один с Pred и один без, который использует std::less), поскольку параметры шаблона шаблона для шаблонов функций явно запрещены в С++ 98.

template<typename T, typename Pred>
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = Pred())
{
   //
}

template<typename T>
inline const T BestOfTwo(const T& lhs, const T& rhs)
{
   return BestOfTwo<T, std::less<T> >(lhs, rhs);
}

Ответ 2

Первая версия будет работать, если вы явно указали аргументы шаблона:

BestOfTwo<int, std::less<int>>(3, 5)

Причина в том, что аргументы функции по умолчанию нельзя использовать для вывода типа для параметра шаблона.