Wie in Gregs Antwort und Kommentare erwähnt, sind die zwei verschiedenen Array-Typen (da das ist, was String-Literale sind) das Problem. Vielleicht möchten Sie die Funktion unverändert für generische Typen belassen, sie aber für Zeichenzeiger und Arrays überladen. Dies ist vor allem dann nützlich, wenn Sie sie etwas anders behandeln möchten.
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]) {
// ...
}
Wenn Sie Zeichenzeiger explizit angeben möchten nehmen, dass vergleichen sollte, dann werden die Felder automatisch konvertieren:
compare<char const*>("aa", "bbbb");
Auf der anderen Seite, vielleicht geschrieben vergleichen konnte mit zwei verschiedenen Arten zu arbeiten ? Dies kann auch für andere Arten nützlich sein, z. vielleicht ruft es f(a)
wenn a.size() < b.size()
, und f(b)
sonst (mit f
überlastet). (T1 und T2 sind erlaubt unter den gleichen Typ zu sein, und dies würde ersetzen Ihre Funktion, anstatt sie wie die beiden oben genannten zu überlasten.)
template<typename T1, typename T2>
void compare(T1 const& a, T2 const& b) {
// ...
}
@ Greg, was ist das Problem mit der aktuellen Erklärung? – chappar
Ihre Deklaration wie geschrieben erfordert, dass der Funktionsvergleich zwei Parameter vom gleichen Typ verwendet. "const char [3]" und "const char [5]" sind nicht vom selben Typ. –
In Ihrem vorhandenen Code würde der "Vergleich" zu etwas wie void compare (char a [2], char b [4]) führen. Das Verwenden von Zeigern anstelle von Referenzen bedeutet, dass T sicher als ein "Zeichen" ausgewertet werden kann, anstelle von zwei unterschiedlich großen Arrays (die unterschiedliche Typen sind). – Justicle