gpt4 book ai didi

c++ - std::transform() 和 toupper(),没有匹配的函数

转载 作者:IT老高 更新时间:2023-10-28 13:23:32 25 4
gpt4 key购买 nike

我尝试了这个问题的代码 C++ std::transform() and toupper() ..why does this fail?

#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

您的代码不起作用的原因:命名空间 std 中有另一个重载函数 toupper 导致解析名称时出现问题,因为编译器无法决定当您简单地传递 std::toupper 时,您指的是哪个重载。这就是为什么编译器在错误消息中说 unresolved 重载函数类型,这表明存在重载。

因此,为了帮助编译器解决正确的重载问题,您必须将 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(),没有匹配的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7131858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com