我尝试过这个问题的代码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名称空间中定义。
::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在错误消息中说的原因,该消息指示存在过载。
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