2010-10-30 10 views
5

Ich versuche, das folgende Programm mit Qt Creator 2.0.1 zu kompilieren:Warum kompiliert sich ptr_fun (tolower) nicht in mingw?

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

mingw führt den folgenden Fehler:

keine passende Funktion für Aufruf ptr_fun (< ungelöst überladene Funktionstyp>)

Diese Funktion kompiliert gut mit VC++ 2010 Express. Was stimmt nicht mit Mingw?

Danke.

Antwort

5

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.

1

Warum rufen Sie nicht nur

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

?

+0

aus Gründen, die nicht mit der Frage verbunden sind, warum nicht ;-) –

0

Nichts ist falsch mit Mingw. Es gibt mehrere Überlastungen für tolower, Erzeugen der Meldung „ungelöste überlastet Funktion.

Sie benötigen die Überlastung Sie verwenden möchten, angeben, eigher über einige Guss (int)(*)(char)tolower oder eine Zwischengröße.