http://stackoverflow.com/questions/19876746/stdtolower-and-visual-studio-2013
http://forums.codeguru.com/showthread.php?489969-no-matching-function-transform
std::tolower
is overloaded in C++, it's declared in <cctype>
as
int tolower(int);
and also in <locale>
as
template<CharT> CharT tolower(CharT, const locale&);
so when you say "std::tolower
" you get an ambiguous(模糊不清的) reference to an overloaded function.
- Why
::tolower
version is working?
When you include <cctype>
the one-argument overload is declared in namespace std
and mightalso be declared in the global namespace, depending on the compiler. If you include <ctype.h>
then it's guaranteed to be included in the global namespace, and ::tolower
will work (although note Dietmar's points about when it's not safe). The two-argument overload from <locale>
is never declared in the global namespace, so ::tolower
never refers to the two-argument overload.
2. Why
std::tolower
is not working in std::transform?
See above, it's an overloaded name.