一尘不染

std :: transform()和toupper(),无匹配函数

algorithm

我尝试过这个问题的代码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有关的问题吗?


阅读 582

收藏
2020-07-28

共1个答案

一尘不染

只需使用::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

2020-07-28