gpt4 book ai didi

c++ - "transform(s.begin(), s.end(), s.begin(), tolower)"Xcode 5无法编译

转载 作者:行者123 更新时间:2023-11-28 02:53:50 30 4
gpt4 key购买 nike

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

最佳答案

长话短说:
问题是 tolower 是一个 int(int) 函数,因此 UnaryOperation 类型推导在您对 transform 的调用中并不明显

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

unary operation function object that will be applied.
The signature of the function should be equivalent to the following:
Ret fun(const Type &a);
The signature does not need to have const &. The type Type must be such that an object of type InputIt can be dereferenced and then implicitly converted to Type. The type Ret must be such that an object of type OutputIt can be dereferenced and assigned a value of type 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;
}

关于c++ - "transform(s.begin(), s.end(), s.begin(), tolower)"Xcode 5无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446693/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com