"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
我刚开始使用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
问题是tolower
是int(int)
函数,所以在调用transform
时UnaryOperation
类型推导不明显。
细节: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;
}
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 调用'begin(int [n])'没有匹配函数
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 为constchar*定义std::begin合法吗
- constexpr begin of a std::array
- Xcode 语义问题引用或以前定义的代码
- 使用 Xcode 将双精度存储在数组C++中
- Xcode 9.4.1 中的 Apple Mach-O 链接器 (id) 错误
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- 了解向量中的 .begin 和 .end
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- 混淆 Begin() 方法作为参数
- std::ranges::begin 和 std::begin 有什么区别?
- Qt - 从XCode上传到MacOS AppStore
- 在 xcode 10 上找不到 stdlibc++ 标头错误
- "transform(s.begin(), s.end(), s.begin(), tolower)"无法在 Xcode 5 中编译