Das Problem die Mehrdeutigkeit wird durch die Funktion Vorlage eingeführt
template <class charT> charT tolower(charT c, const locale& loc);
ich denke, dass mingw <locale>
indirekt von einem der Header Ihr Programm aufgenommen hat, enthält, während VC++ nicht.
Sie können dieses Problem beheben, indem disambiguating tolower
mit einer Besetzung:
typedef int (*foo)(int);
ptr_fun((foo)tolower);
Oder wenn Sie wie Wartung Programmierer Schuhe bei Ihnen zu werfen:
ptr_fun((int (*)(int))tolower);
Beachten Sie, dass als Armen sagt, Sie don‘ t brauchen eigentlich ptr_fun
hier. Es konvertiert eine unäre Funktion in eine anpassungsfähige unäre Funktion, aber transform
benötigt seinen Parameter nicht, um anpassungsfähig zu sein. Der Unterschied besteht darin, ob für den Typ geschachtelte Typdefinitionen für argument_type
und vorhanden sind. Raw-Funktionstypen nicht, ptr_fun
gibt einen Funktortyp zurück, der dies tut.
Schließlich ist es in der Regel nicht sicher, die C tolower
auf einem char
zu nennen, wenn char
auf Ihrer Plattform unterzeichnet ist. Ihr Beispiel String ist in Ordnung, weil keiner der Charaktere in "abc" negativ ist, aber Sie sollten etwas tun:
char fixed_tolower(char c) {
return tolower((unsigned char)c);
}
transform(..., fixed_tolower);
Oder für eine bessere Chance inlining:
struct fixed_tolower : unary_function<char, char> {
char operator()(char c) const {
return tolower((unsigned char)c);
}
};
transform(..., fixed_tolower());
I haven Es wurde überprüft, ob es tatsächlich einen Unterschied in GCC macht, entweder von der POV des Inlining oder von der POV, ob die Mingw-Implementierung von tolower
tatsächlich negative Zahlen enthält.
aus Gründen, die nicht mit der Frage verbunden sind, warum nicht ;-) –