2015-07-23 25 views
6

mam:: tolower vs różnicy std :: TOLOWER

using namespace std; 
vector<char> tmp; 
tmp.push_back(val); 
... 

Teraz, gdy próbuję

transform(tmp.begin(), tmp.end(), tmp.begin(), std::tolower); 

To nie skompilować, ale kompiluje:

transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower); 

Jaka jest problem z std::tolower? Działa z jednym argumentem, np. std::tolower(56) kompiluje. Dzięki!

+1

związane/dwóch egzemplarzach: http://stackoverflow.com/q/5270780/ (patrz Druga odpowiedź http: // stackoverflow. com/a/5270970 /) – dyp

+0

@dyp Więc jeśli 'std :: lower' potrzebuje dwóch argumentów, jak to działa' std :: tolower (56) '? – hovo

+1

'std :: tolower' jest przeciążone, są dwie funkcje (jedna [funkcja z biblioteki C] (http://en.cppreference.com/w/cpp/string/byte/tolower) przyjmująca jeden argument i [jeden szablon funkcji] (http://en.cppreference.com/w/cpp/locale/tolower), który przyjmuje dwa argumenty) o nazwie 'tolower' w przestrzeni nazw' std'. W globalnej przestrzeni nazw, jeśli jest cokolwiek, to tylko biblioteka 'tolower' biblioteki C pobiera jeden argument. – dyp

Odpowiedz

3

ma dwa przeciążenia i nie można go rozwiązać dla UnaryOperation, gdzie wersja C ::tolower nie.

Jeśli chcesz użyć std::tolower można użyć lambda jako

transform(tmp.begin(), tmp.end(), tmp.begin(), [](unsigned char c) {return std::tolower(c); }); 
+3

Istnieje także jednoargumentowe 'std :: tolower', po prostu musisz ujednoznacznić. –

+0

@BaummitAugen, czy można go ujednoznacznić przez '& std :: tolower'? –

+0

@AaronMcDaid Nie sądzę, ale możesz spróbować, jeśli chcesz. :) –