//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>)â
答案 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;
}