С++ параметр по умолчанию в шаблоне не разрешен?
В моем коде на С++ я написал вот так:
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). Но я думаю, что предыдущий стиль более удобен, и я не понял, где он поступил неправильно. Какие предложения?
Ответы
Ответ 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)
Причина в том, что аргументы функции по умолчанию нельзя использовать для вывода типа для параметра шаблона.