You need to put a double colon before toupper
:
transform(input.begin(), input.end(), input.begin(), ::toupper);
Explanation:
There are two different toupper
functions:
toupper
in the global namespace (accessed with::toupper
), which comes from C.toupper
in thestd
namespace (accessed withstd::toupper
) which has multiple overloads and thus cannot be simply referenced with a name only. You have to explicitly cast it to a specific function signature in order to be referenced, but the code for getting a function pointer looks ugly:static_cast<int (*)(int)>(&std::toupper)
Since you’re using namespace std
, when writing toupper
, 2. hides 1. and is thus chosen, according to name resolution rules.