尝试在C ++中使用带迭代器和函数的for_each时,“未解析的重载函数类型”

时间:2011-09-23 16:08:19

标签: c++ iterator g++

//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 个答案:

答案 0 :(得分:17)

写:

for_each( c.begin(), c.end(), ::tolower );

或者:

for_each( c.begin(), c.end(), (int(*)(int))tolower);

我已经多次面对这个问题了,我已经厌倦了在我的代码以及其他代码中修复它。

您的代码无效的原因:命名空间tolower中有另一个重载函数std,这在解析名称时会导致问题,因为编译器无法确定您的代码是什么当你只是传递tolower 1 时,指的是。这就是编译器在错误消息中说unresolved overloaded function type的原因,它表明存在重载。

因此,为了帮助编译器解决正确的重载,您需要将tolower转换为

(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.

答案 1 :(得分:0)

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;
}