Robert Hartmann wrote:
> Hier mein Ansatz und g++ (GCC) 4.5.2 Fehlermeldung:
>
> inline void tolowerCase(std::string& str){
> std::transform(str.begin(), str.end(), str.begin(), std::tolower);
> }
Selbst, wenn das compilieren würde, hätte das das Problem, dass du den
Kontrakt von 'tolower' verletzt. 'tolower' will ein nach 'unsigned char'
gecastetes Zeichen haben, 'std::string::value_type' ist aber 'char'.
Wenn schon, dann irgendwas der Art
char toLowerChar(char c) {
return std::tolower(static_cast<unsigned char>(c));
}
// ...
std::transform(str.begin(), str.end(), str.begin(), toLowerChar);
(Disclaimer: ungetestet)
> error: no matching function for call to
> 'transform(std::basic_string<char>::iterator,
> std::basic_string<char>::iterator, std::basic_string<char>::iterator,
> <unresolved overloaded function type>)'
Möglicherweise stolpert er über die Überladung
template <class charT> charT tolower(charT c, const locale& loc);
aus <locale>, welcher über zahlreiche andere Header (z.B. die Streams)
mitkommt.
> Zwei Ansätze nach "herum-googeln" geben keine Compilerfehlermeldungen:
>
> 1.)
> std::transform(str.begin(), str.end(), str.begin(), ::tolower);
>
> 2.)
> std::transform(str.begin(), str.end(), str.begin(),
> (int (*)(int))tolower);
>
> Fall 1 holt sich also eine tolower, die nicht im namespace std liegt.
> Woher die auch immer kommt?
Aus <ctype.h>.
> Fall 2 wird, zumindest sieht das für mich so aus, ein Typecast pointer
> nach int gemacht, aber warum das hilft ... ist mir nicht ganz klar.
Das löst eine überladene Funktion auf. Nur die von dir gewünschte
Überladung lässt sich nach (int (*)(int)) casten.
Allerdings ist meine Erfahrung, dass die Verwendung von <cctype>- und
<cstring>-Funktionen in C++ in der Praxis durchaus steinig ist. Gerade
deinen Fall hatte ich neulich aus dem Code eines Kollegen rausoperiert,
weil es einer der verwendeten Compiler ums Verrecken nicht fressen
wollte. Bei älteren Compilern/Bibliotheken schießen dann bei sowas auch
gerne mal Makros quer (Borland macht '#define strcpy __strcpy__',
Ergebnis: ''__strcpy__' is not a member of 'std'').
Stefan