«Неразрешенный тип перегруженной функции» при попытке использовать for_each с итераторами и функцией в C ++ - PullRequest
8 голосов
/ 23 сентября 2011
//for( unsigned int i=0; i < c.size(); i++ ) tolower( c[i] );
for_each( c.begin(), c.end(), tolower );

Я пытаюсь использовать цикл for_each вместо цикла for для назначения.

Я не уверен, почему я получаю это сообщение об ошибке:

In function âvoid clean_entry(const std::string&, std::string&)â:
prog4.cc:62:40: error: no matching function for call to âfor_each(std::basic_string<char>::iterator, std::basic_string<char>::iterator, <unresolved   overloaded function type>)â

Ответы [ 2 ]

17 голосов
/ 23 сентября 2011

Запись:

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.
0 голосов
/ 23 сентября 2011

1) У вас есть using namespace std; где-то в вашем коде.Опасность импорта всего пространства имен std заключается в том, что вы не обязательно знаете, что получаете.В этом случае вы импортировали перегрузки std::tolower.

Никогда не вводите using namespace std;, даже если ваш учебник или ваш инструктор говорит вам.

2) Поскольку вы ограничены в использованииstd::transform, вы можете изменить строку, используя std::for_each:

#include <cctype>
#include <algorithm>
#include <string>
#include <iostream>

void
MakeLower(char& c)
{
  c = std::tolower(c);
}

int
main ()
{
  std::string c("Hello, world\n");
  std::for_each(c.begin(), c.end(), MakeLower);
  std::cout << c;
}
...