如何解决std :: transform和toupper,无匹配函数
只需使用::toupper
代替即可std::toupper
。也就是说,toupper
在全局名称空间中定义,而不是在std
名称空间中定义。
std::transform(s.begin(), s.end(), std::back_inserter(out), ::toupper);
它的工作:http ://ideone.com/XURh7
您的代码无法正常工作的原因:toupper
名称空间中还有另一个重载函数,std
在解析名称时会导致问题,因为当您简单地传递时,编译器无法确定您所指的是哪个重载std::toupper
。这就是编译器unresolved
overloaded function type
在错误消息中说的原因,该消息指示存在过载。
因此,为了帮助编译器在解析到正确的过载,你投std::toupper
的
(int (*)(int))std::toupper
也就是说,以下将起作用:
//see the last argument, how it is casted to appropriate type
std::transform(s.begin(), s.end(), std::back_inserter(out),(int (*)(int))std::toupper);
自己检查一下:http ://ideone.com/8A6iV
解决方法
我尝试过这个问题的代码C ++ std ::transform()和toupper()..为什么会失败?
#include <iostream>
#include <algorithm>
int main() {
std::string s="hello";
std::string out;
std::transform(s.begin(),s.end(),std::back_inserter(out),std::toupper);
std::cout << "hello in upper case: " << out << std::endl;
}
从理论上讲,它应该是Josuttis的书中的例子之一,但是它不能编译http://ideone.com/aYnfv。
为什么GCC抱怨:
no matching function for call to ‘transform(
__gnu_cxx::__normal_iterator<char*,std::basic_string
<char,std::char_traits<char>,std::allocator<char> > >,__gnu_cxx::__normal_iterator<char*,std::back_insert_iterator<std::basic_string
<char,<unresolved overloaded function type>)’
我在这里想念什么吗?与GCC有关的问题吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。