"transform(s.begin(), s.end(), s.begin(), tolower)"无法在 Xcode 5 中编译

"transform(s.begin(), s.end(), s.begin(), tolower)" can't be compiled in Xcode 5

本文关键字:begin Xcode 编译 end transform tolower      更新时间:2023-10-16

我刚开始使用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和algorithm


问题是tolowerint(int)函数,所以在调用transformUnaryOperation类型推导不明显。

细节:
transform的最后一个参数应该是unary_operation,具有以下属性(来自CPPReference):

将应用的一元操作函数对象。
函数的签名应该等同于以下内容:
[font =宋体]签名不需要有const &type类型必须使inputtit类型的对象可以解引用,然后隐式地转换为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;  
}  

或者,如果lambda吓到您,您可以使用普通的旧函数适配器:

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