2010-10-30 11 views
5

estoy tratando de compilar el programa siguiente utilizando Qt Creator 2.0.1:¿Por qué ptr_fun (tolower) no se compila en mingw?

void f() 
{ 
    string a = "abc"; 
    transform(a.begin(), a.end(), a.begin(), ptr_fun(tolower)); 
} 

MinGW lanza el siguiente error:

ninguna función coincidente para la llamada a ptr_fun (< sin resolver sobrecargado tipo de función>)

Esa función compila bien con VC++ 2010 Express. ¿Qué pasa con mingw?

Gracias.

Respuesta

5

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.

1

¿Por qué no llamas a

transform (a.begin, a.end(), a.begin(), tolower); 

?

+0

por razones no relacionadas con la pregunta, ¿por qué no ;-) –

0

Nada está mal con mingw. Existen múltiples sobrecargas para tolower, generando el mensaje "sin resolver sobrecargado función.

Es necesario especificar cuales sobrecarga que desea utilizar, eigher a través de algún fundido (int)(*)(char)tolower o una variable intermedia.

Cuestiones relacionadas