我是使用stl c ++的新手。我从书中复制了这个功能:
string ConverToLowerCase(string s)
{
transform(s.begin(), s.end(), s.begin(), tolower);//Compile Error:No matching function for call to 'transform'
return s;
}
我有#include cctype和算法。
答案 0 :(得分:2)
TL; DR:
问题是tolower
是int(int)
函数,因此在UnaryOperation
的调用中transform
类型扣除不明显。
详细说明:
transform
的最后一个参数应该是一个unary_operation,具有以下属性(来自CPPReference):
将应用的一元操作功能对象 功能的签名应等同于以下内容:
Ret fun(const Type& a);
签名不需要const&amp ;. 类型Type必须是可以取消引用InputIt类型的对象,然后隐式转换为Type。类型Ret必须是这样的,可以取消引用类型为OutputIt的对象并为其指定Ret类型的值。
tolower
的签名是:
int tolower( int ch );
所以它并没有真正满足这些要求。有些编译器可能更聪明的类型推导并让它通过,但在你的情况下,你需要使它看起来像char fun(const char&)
函数(或char fun(char)
,因为对字符的引用并不真正有意义)。
这可以使用例如一个lambda函数:
string ConverToLowerCase(string s) {
std::transform(s.begin(), s.end(), s.begin(), [](char c) {
return std::tolower(c);
});
return s;
}
或者,如果lambdas吓到你,你可以用一个普通的旧函数适配器来做到这一点:
char tolower_char(char c) {
return std::tolower(c);
}
string ConverToLowerCase(string s) {
std::transform(s.begin(), s.end(), s.begin(), &tolower_char);
return s;
}