- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
transform 算法中使用 toupper 函数 transform 算法中使用 toupper 函数 今天需要实现一个把小写字母转换为大写字母的函数,由于 传入的参数是 SL 中的 string 类,所以第一想法就是用 transform 算法来实现这功能,但是报错了。回家之后写了 下面一个测试代码来看看到底错在哪里和怎么解决。 #include lt;iostreamgt; #include lt;algorithmgt; #include lt;cctypegt; using namespace std; int main(int argc, char *argv[]) { string s(hello world); transform(s.begin(), s.end(), s.begin(), toupper); coutlt;lt;slt;lt;endl; return 0; } 下面是 g++ 的报错信息: no matching function for call to `transform(__gnu_cxx::__normal_iteratorlt;char*, std::basic_stringlt;char,std::char_traitslt;chargt;,std::all ocatorlt;chargt;gt;gt;,__gnu_cxx::__normal_iteratorlt ;char*,std::basic_stringlt;char,std::char_traitslt;chargt;, std::allocatorlt;chargt;gt;gt;,__gnu_cxx::__normal_iter atorlt;char*,std::basic_stringlt;char,std::char_traitslt;ch argt;, std::allocatorlt;chargt; gt; gt;, lt;unknown typegt;) 从上面红的部分可以看出, touppe 函数被认为是未知类型的 函数了。但是我另外把 toupper 函数独立抽出来测试的时候编译是通过的,也就是说这个函数是没问题的,那么到底问题在哪呢? 在网上游荡一圈之后,终于找到了原因: 标准库重载了一个 touppe 函数,而 GCC 完全由 C 库去提 供重载,而 glibc 做不到这一点,所以在编译的时候 g++ 就 认为这个函数有歧义了。下面就是在标准库中 toupper 函数 的两种形式: int std :: toupper ( int ); // from lt;cctypegt; template lt; class chart gt; charT std :: toupper ( charT , const locale amp;); // from lt;localegt; 问题找出来了,但是总要有解决的方法。既然报错是因为有 歧义,所以只要把歧义消除便可。 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);
您可能关注的文档
最近下载
- RME-FireFace-UC中文说明书.pdf
- 2025年(完整版)十八项核心制度培训考核试题(含答案).docx VIP
- 变电站接地网深井接地实施方案计算.doc VIP
- 集成测试:集成测试与持续集成:集成测试基础理论.docx VIP
- 《复变函数与积分变换》习题《复变函数与积分变换》习题册《复变函数与积分变换》习题册《复变函数与积分变换》习题册.doc VIP
- 婴幼儿托育服务与管理人才培养方案 .pdf VIP
- 小班娃娃家课件.pptx VIP
- 森林防火通道施工组织设计.doc VIP
- 精品解析:河北省邢台市2025-2026学年上学期第二次学业质量检测八年级数学试题(解析版).docx VIP
- IP形象合同协议版.docx VIP
有哪些信誉好的足球投注网站
文档评论(0)