打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
transform算法中使用toupper函数

transform算法中使用toupper函数

 

今天需要实现一个把小写字母转换为大写字母的函数,由于传入的参数是SL中的string类,所以第一想法就是用transform算法来实现这功能,但是报错了。回家之后写了下面一个测试代码来看看到底错在哪里和怎么解决。

 

#include <iostream>

#include <algorithm>

#include <cctype>

 

using namespace std;

 

int main(int argc, char *argv[])

{

    strings("hello world");

   transform(s.begin(), s.end(), s.begin(), toupper);

   cout<<s<<endl;

   

    return0;   

}

 

下面是g++的报错信息:

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> >>, <unknowntype>)'

 

从上面红的部分可以看出,touppe函数被认为是未知类型的函数了。但是我另外把toupper函数独立抽出来测试的时候编译是通过的,也就是说这个函数是没问题的,那么到底问题在哪呢?

      在网上游荡一圈之后,终于找到了原因:

      标准库重载了一个touppe函数,而GCC完全由C库去提供重载,而glibc做不到这一点,所以在编译的时候g++就认为这个函数有歧义了。下面就是在标准库中toupper函数的两种形式:

int std :: toupper ( int ); // from<cctype>

 

template < class chart >

charT std :: toupper ( charT , const locale&);  // from<locale>

 

   问题找出来了,但是总要有解决的方法。既然报错是因为有歧义,所以只要把歧义消除便可。

1、通过介入包装函数

这是最简单的办法,因为包装函数只有一个,只要在包装函数中指明要使用的函数,歧义自然就没了,以toupper为例,我们可以使用下面这样的一个包装函数:

 Int toUpper( int c )

{

      return toupper( c ) ;

}

 

2、强制转化:将toupper转换为一个返回值为int,参数只有一个int的函数指针:

std::transform(s.begin(), s.end(), s.begin(), (int(*)(int))toupper);

 

3、GCC中将toupper实现为一个宏而不是函数,而在全局命名空间中有实现的函数(而不是宏),所以我们明确命名空间,这并不是总奏效,但是在我的g++环境中没有问题:

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[C++错误处理]no matching function for call to transform
String 字符串 | 赖明星
字符串面试题
快速傅里叶变换与逆变换(一)
C语言部分函数原型实现
DES加密解密算法详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服