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 type

std::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

回到顶部