Запись:
for_each( c.begin(), c.end(), ::tolower );
Или:
for_each( c.begin(), c.end(), (int(*)(int))tolower);
Я сталкивался с этой проблемой столько раз, что устал ее исправлять в своем коде, а также вчужой код.
Причина, по которой ваш код не работает: в пространстве имен *1000* есть другая перегруженная функция *1000*, которая вызывает проблемы при разрешении имени, поскольку компилятор не может решить, какая перегрузкаВы имеете в виду, когда вы просто передаете tolower
1 .Вот почему компилятор говорит unresolved overloaded function type
в сообщении об ошибке, которое указывает на наличие перегрузок (ы).
Поэтому, чтобы помочь компилятору разрешить правильную перегрузку, необходимо привести tolower
as
(int (*)(int))tolower
, тогда компилятор получает подсказку для выбора глобальной функции tolower
, которую можно использовать другими способами, написав ::tolower
.
1,Я думаю, вы написали using namespace std
в своем коде.Я бы также предложил вам не делать этого.В общем случае используйте полностью определенные имена.
Кстати, я думаю, что вы хотите преобразовать входную строку в нижний регистр, если так, то std::for_each
этого не сделает.Вы должны использовать std::transform
функцию как:
std::string out;
std::transform(c.begin(), c.end(), std::back_inserter(out), ::tolower);
//out is output here. it's lowercase string.