Вызов функции шаблона заставляет компилятор создавать экземпляр функции whole , и оператор, вызывающий ошибку, очевидно, не работает для параметров int
. Есть несколько способов отделить два случая:
Во-первых, используя специализацию из greaterThan
для строк:
template < class TParam >
bool greaterThan (TParam A, TParam B) {
return A > B;
}
template<>
bool greaterThan< string > (string A, string B) {
return A.compare(B) > 0;
}
Во-вторых, используя перегрузку из greaterThan
для строк:
template < class TParam >
bool greaterThan (TParam A, TParam B) {
return A > B;
}
bool greaterThan (string const & A, string const & B) {
return A.compare(B) > 0;
}
В обоих вариантах решение о том, какую функцию вызывать, принимается во время компиляции, а не при проверке типа во время выполнения. Однако обратите внимание, что перегрузка принимает параметры по ссылка , тогда как специализация принимает параметры по значение , поскольку оно должно точно соответствовать сигнатуре функции базового шаблона.
Кроме того, со специализациями функция, выбранная компилятором, может иногда оказаться неожиданной. И поскольку шаблоны функций могут быть только явно специализированными (т.е. не частично специализированными), перегрузка предлагает все преимущества и ни один из недостатков, связанных со специализациями.
Для получения дополнительной информации см. " Почему бы не специализировать шаблоны функций? " Херба Саттера.