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

时间:2014-03-17 03:59:02

标签: c++ xcode stl

我是使用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和算法。

1 个答案:

答案 0 :(得分:2)

TL; DR:
问题是tolowerint(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;  
}