Как указано в ответе и комментариях Грега, проблема заключается в двух разных типах массивов (поскольку это и есть строковые литералы). Возможно, вы захотите оставить функцию как есть для универсальных типов, но перегружайте ее для указателей и массивов символов, это в основном полезно, когда вы хотите обрабатывать их немного по-другому.
void compare(char const* a, char const* b) {
// do something, possibly use strlen()
}
template<int N1, int N2>
void compare(char const (&a)[N1], char const (&b)[N2]) {
// ...
}
Если вы хотите указать, что сравнение должно явно указывать символьные указатели, то массивы автоматически преобразуются:
compare<char const*>("aa", "bbbb");
С другой стороны, может быть, можно написать сравнение для работы с двумя разными типами? Это может быть полезно и для других типов, например, возможно, он вызывает f(a)
, если a.size() < b.size()
, и f(b)
в противном случае (с перегруженной f
). (T1 и T2 могут быть одного и того же типа ниже, и это заменит вашу функцию вместо того, чтобы перегружать ее как две выше.)
template<typename T1, typename T2>
void compare(T1 const& a, T2 const& b) {
// ...
}