2010-10-30 3 views
5

Je suis en train de compiler le programme suivant en utilisant Qt Creator 2.0.1:Pourquoi ptr_fun (tolower) ne compile pas dans mingw?

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

MinGW jette l'erreur suivante:

pas de fonction concordante pour appel à ptr_fun (< type de fonction non résolue surcharge>

Cette fonction se compile bien avec VC++ 2010 Express. Quel est le problème avec Mingw?

Merci.

Répondre

5

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.

1

Pourquoi ne pas appeler simplement

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

?

+0

pour des raisons non liées à la question, pourquoi pas ;-) –

0

Rien ne va pas avec MINGW. Il y a plusieurs surcharges pour tolower, générant le message « non résolue surchargée fonction.

Vous devez spécifier qui surcharge que vous souhaitez utiliser, eigher via un cast (int)(*)(char)tolower ou une variable intermédiaire.

Questions connexes