Le problème est l'ambiguïté introduite par le modèle de fonction
template <class charT> charT tolower(charT c, const locale& loc);
Je suppose que MinGW a inclus <locale>
indirectement de l'un des en-têtes de votre programme inclut, alors que VC++ ne l'a pas fait.
Vous pouvez résoudre ce problème en disambiguating tolower
avec un casting:
typedef int (*foo)(int);
ptr_fun((foo)tolower);
Ou si vous aimez les programmeurs d'entretien de jeter des chaussures à vous:
ptr_fun((int (*)(int))tolower);
Notez que comme le dit Armen, vous n » t réellement besoin ptr_fun
ici. Il convertit une fonction unaire en une fonction unaire adaptable, mais transform
n'a pas besoin de son paramètre pour être adaptable. La différence est de savoir si le type a des typedefs imbriqués pour argument_type
et result_type
. Les types de fonctions brutes ne le sont pas, ptr_fun
renvoie un type de foncteur qui le fait.
Enfin, il n'est pas sûr en général d'appeler le C tolower
sur un char
si char
est signé sur votre plate-forme. Votre exemple chaîne est OK, car aucun des caractères « abc » est négatif, mais vous devez faire quelque chose comme ceci:
char fixed_tolower(char c) {
return tolower((unsigned char)c);
}
transform(..., fixed_tolower);
Ou pour une meilleure chance de inline:
struct fixed_tolower : unary_function<char, char> {
char operator()(char c) const {
return tolower((unsigned char)c);
}
};
transform(..., fixed_tolower());
refuge I 't vérifié si elle fait effectivement une différence dans GCC, soit à partir de la POV de inline ou de la POV de savoir si l'implémentation de tolower
mingw fait barfs sur les nombres négatifs.
pour des raisons non liées à la question, pourquoi pas ;-) –