2015-07-23 26 views
6

ho:: tolower vs differenza std :: tolower

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

Ora in cui provo

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

Non riesce a compilare, ma questo compila:

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

Qual è il problema con std::tolower? Funziona con un argomento, ad esempio, compila std::tolower(56). Grazie!

+1

correlati/duplicato: http://stackoverflow.com/q/5270780/ (vedi la seconda risposta http: // StackOverflow. it/a/5270970 /) – dyp

+0

@dyp Quindi se 'std :: lower' ha bisogno di due argomenti, come mai' std :: tolower (56) 'funziona? – hovo

+1

'std :: tolower' è sovraccarico, ci sono due funzioni (una [funzione dalla libreria C] (http://en.cppreference.com/w/cpp/string/byte/tolower) prendendo un argomento e [uno function template] (http://en.cppreference.com/w/cpp/locale/tolower) che accetta due argomenti) con il nome 'tolower' nel namespace' std'. Nel namespace globale, se c'è qualcosa, allora è solo il 'tolower' della libreria C che prende un argomento. – dyp

risposta

3

std::tolower ha due sovraccarichi e non può essere risolto per il UnaryOperation in cui la versione C ::tolower non lo fa.

Se si desidera utilizzare il std::tolower è possibile utilizzare un lambda come

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

C'è anche un unario 'std :: tolower', hai solo bisogno di disambiguare. –

+0

@BaummitAugen, può essere disambiguato tramite '& std :: tolower'? –

+0

@AaronMcDaid Io non la penso così, ma puoi provare se vuoi. :) –