El problema es la ambigüedad introducida por la plantilla de función
template <class charT> charT tolower(charT c, const locale& loc);
supongo que MinGW ha incluido <locale>
indirectamente de una de las cabeceras de su programa incluye, mientras que VC++ no.
Puede solucionar este problema mediante desambiguantes tolower
con un reparto:
typedef int (*foo)(int);
ptr_fun((foo)tolower);
O si te gusta programadores de mantenimiento para lanzar zapatos a usted:
ptr_fun((int (*)(int))tolower);
Tenga en cuenta que como dice Armen, usted don' En realidad, necesito ptr_fun
aquí. Convierte una función unaria en una función unaria adaptable, pero transform
no necesita que su parámetro sea adaptable. La diferencia es si el tipo ha anidado typedefs para argument_type
y result_type
. Los tipos de función sin formato no, ptr_fun
devuelve un tipo de functor que sí lo hace.
Por último, no es seguro en general llamar al C en un char
si se firma en su plataforma char
. Su ejemplo de cadena está bien, porque ninguno de los personajes de "abc" es negativo, pero hay que hacer algo como esto:
char fixed_tolower(char c) {
return tolower((unsigned char)c);
}
transform(..., fixed_tolower);
O para una mejor oportunidad de expansión en línea:
struct fixed_tolower : unary_function<char, char> {
char operator()(char c) const {
return tolower((unsigned char)c);
}
};
transform(..., fixed_tolower());
no he Comprobé si realmente hace alguna diferencia en GCC, ya sea desde el punto de vista de la creación de líneas o desde el punto de vista de si la implementación de mingw de tolower
muestra realmente números negativos.
por razones no relacionadas con la pregunta, ¿por qué no ;-) –