no matching function for call to ‘transform

文章得从《C++标准程序库》中的一个源代码说起。今天看到了第11章String,于是敲了书上的源代码,在Ubuntu下一编译,靠,竟然报错了。

STL报错那是什么概念……信息异常混乱啊!于是就直接去Google搜索错误提示关键字了。恩,找到了相关问题,同样也是《C++标准程序库》上的这份代码造成的。

现来看一下代码吧:

错误提示如下:

toLower.cpp: In function ‘int main()’:
toLower.cpp:11: error: 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> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded function type>)’

确实很“复杂”,看起来头晕。看看达人的解释:

在里面声明了一个C版本的函数tolower,int tolower(int); 而在中间也声明了一个函数模板:

template
charT tolower( charT c , const locale& loc );

如果这两个头文件都同时包含到程序中来的话(C++标准头文件可能会包含另外的标准头文件。例如有的编译器在一些标准头文件中,如,会包含或头文件。这样,包含可能会引入或),由于这些 tolower 函数都位于同一 std 名字空间,于是形成了函数重载。这样的话,transform 函数(也是一个模板函数)的第四个参数是tolower 的时候,此时给定的 tolower 只是作为一个函数指针使用,缺乏类型推导所需要的函数参数信息,所以无法推导出函数的类型,也就无法决定使用哪一个重载函数。

如果想使用非模版的 tolower 函数,有多种方法可以解决:

transform( s.begin(), s.end(), s.begin(), (int(*)(int))tolower);

或者

int (*pf)( int ) = tolower; // pf 是一个函数指针,其类型已经明确。
transform( s.begin(), s.end(), s.begin(), pf );

或者

// 使用一个包装函数,避免直接使用 tolower 函数由于重载带来的问题。
int my_tolower( int c )
{
return tolower( c ); // 根据 c 的类型可以确定使用 tolower 的哪个重载函数。
}

// …
// my_tolower 是非模版非重载函数,避免了函数重载带来的类型解析问题。
transform( s.begin(), s.end(), s.begin(), my_tolower );

另外,非模板函数的 tolower 其实是来自于标准 C 库函数,因此在 C++ 标准库中它同时位于全局和 std 名字空间。既然 std 名字空间内 tolower 函数有可能形成函数重载,但是在全局名字空间中的 tolower 函数却只有一个,所以也可以直接使用全局名字空间中的 tolower:

transform( s.begin(), s.end(), s.begin(), ::tolower);

当然,模板函数和非模板函数 tolower 的区别还是很明显的:前者有两个参数,后者只有一个参数。而程序中使用的 transform 函数的第四个参数要求,如果是函数的话只能是有一个参数的函数,所以从这方面来说重载函数的选择问题是可以得到解决的。有的编译器可能就是根据这一点做了进一步的判别处理,或者直接选择了非模版函数,从而解决了这一问题。但是 C++ 标准并没有要求一定要解决类似的不确定问题,所以无论编译器是怎样处理的,解决或者没有解决,应该都是符合标准的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个错误提示表明在调用`transform`函数时没有找到匹配的函数。根据引用[2]中的信息,可以看出这是一个模板函数,接受四个参数`start`、`end`、`result`和`unaryFunc`。其中`start`和`end`是输入序列的起始和结束迭代器,`result`是输出序列的迭代器,`unaryFunc`是一个用于对输入序列进行转换的函数。 根据引用中的模板函数声明,`transform`函数的返回类型是`OutIter`,即输出序列的迭代器类型。根据引用中的编译错误提示,可以猜测在调用`transform`函数时,可能没有正确地指定函数参数的类型。 为了解决这个错误,你可以检查你调用`transform`函数时传递的参数是否与模板函数声明中的参数类型匹配。确保输入序列的起始和结束迭代器、输出序列的迭代器以及转换函数的类型是正确的。如果你使用了自定义类型作为参数,还需要确保你已经正确地重载了相关的运算符或者提供了适当的函数转换。 请根据你的具体代码和错误提示来检查和调整函数调用。如果你需要进一步的帮助,请提供更详细的代码和错误信息,以便更准确地解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ros2: no matching function for call to ‘tf2_ros::TransformBroadcaster::TransformBroadcaster()’](https://blog.csdn.net/yamida/article/details/113106248)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++中错误no matching function for call to transform](https://blog.csdn.net/ctrigger/article/details/110121061)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值