std :: transform()和toupper(),无匹配函数
我尝试过这个问题的代码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::basic_string
<char, std::char_traits<char>, std::allocator<char> > >,
std::back_insert_iterator<std::basic_string
<char, std::char_traits<char>, std::allocator<char> > >,
<unresolved overloaded function type>)’
我在这里想念什么吗?与GCC有关的问题吗?
回答:
只需使用::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 typestd::transform(s.begin(), s.end(), std::back_inserter(out),(int (*)(int))std::toupper);
自己检查一下:http :
//ideone.com/8A6iV
以上是 std :: transform()和toupper(),无匹配函数 的全部内容, 来源链接: utcz.com/qa/419323.html