首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将cctype函数赋值给std:: function,gcc编译错误

将cctype函数赋值给std:: function,gcc编译错误
EN

Stack Overflow用户
提问于 2019-08-10 13:35:15
回答 2查看 102关注 0票数 2

嗨,我希望你喜欢这个问题。我指的是包含文件iscntrl中的函数cctypeisprint等。所有这些函数都接受一个int并返回一个int

下面的代码示例在Wandbox中运行良好,编译器设置为clang。但是在我的混合W64,gcc8.1中,它确实产生了编译错误。我试过C++14和C++17。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <cstddef>
#include <cstdio>
#include <cstdint>

#include <string>
#include <tuple>
#include <functional>
#include <array>
#include <cctype>
//#include <ctype.h>

namespace abc
{
  int two_times( int a )
  {
    printf( "two_times being called\n" );
    return 2*a;
  }

  int three_times( int a )
  {
    printf( "three_times being called\n" );
    return 3*a;
  }
}

int main()
{
  typedef std::tuple< std::string, std::function<int(int)> > item_t;
  std::array< item_t, 3 > array{
    std::make_tuple( "three_times", abc::three_times ),
    std::make_tuple( "two_times", abc::two_times ),
    std::make_tuple( "iscntrl", std::iscntrl ) };

  int i = 2;

  for( const item_t& item : array )
  {
    printf( "operation: %s\n", std::get<0>(item).c_str() );
    int val = std::get<1>(item)( i );
    printf( "val: %d\n", val );
    putchar( '\n' );
  }

  getchar();
  return 0;
}

如您所见,我将循环所需的所有相关内容放入数组中。包括分配给cctype函数的函数对象。

two_times和three_times函数的存在是为了表明我设计的其余部分都很好。如果我只使用这些函数,它就能工作。但在我看来,std::iscntrl只是另一个以int作为参数并返回int的函数。但显然没有,因为它会产生以下编译错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error: too many arguments to function 'constexpr std::tuple<typename std::__decay_and_strip<_Elements>::__type ...> std::make_tuple(_Elements&& ...) [with _Elements = {}]'
     std::make_tuple( "iscntrl", std::iscntrl ) };

哦,是的,如果用#include <ctype.h>替换包含文件并删除iscntrl前面的std::命名空间标签,那么它也突然起作用了。但这不是很好的做法。但也许它告诉了你什么。

让它变得更简单,两者都不起作用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::function<int(int)> f;
f = abc::two_times;
printf( “result: %d\n“, f( 4 ) ); // so far fine
f = std::iscntrl;

然后在最后一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error: no match for 'operator=' (operand types are 'std::function<int(int)>' and '<unresolved overloaded function type>')
   f = std::iscntrl;

我出什么事了吗?有什么简单的解决方案可以让它与gcc一起编译呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-10 13:48:33

标准库(自C++20以来)中很少有函数被称为https://en.cppreference.com/w/cpp/language/extending_std。所有其他人只能通过适当的论据才能被调用,而不是被占用他们的地址。

即使在此之前,标准也没有保证没有超载,这几乎有同样的效果。

在你的例子中,

即使您只直接包含第一个标头,所有标准标头也可能包含除C和采用的头之外的任何其他标头,因此它们可能都是可用的。

当您传递到模板参数时,编译器无法消除您所指的重载的歧义。

您应该做的是根据需要传递一个lambda转发。更重要的是,您可以使用它将参数强制到unsigned char的适当范围,避免未定义的行为。

票数 4
EN

Stack Overflow用户

发布于 2019-08-10 13:45:39

std::iscntrl在错误中被称为<unresolved overloaded function type>,因为在C++中,这个函数确实是重载的。来自int iscntrl( int )头的<cctype>重载和来自<locale>bool iscntrl( charT ch, const locale& loc )重载。编译器不知道这样传递它时要选择哪个函数。

要解决这个问题,并且仍然使用C++版本,您必须传递一个函数,该函数从内部调用iscntrl

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::make_tuple( "iscntrl", [](int c) { return std::iscntrl(c); } );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57445856

复制
相关文章
HTML中的标记
文章目录 前言 块级元素 行内元素 行内块级元素 ---- 前言 HTML中的标记 块级元素 h1-h6>>1-6级标题 p>>段落 div>>定义文档中的节 ul>>定义无序列表 ol>>定义有序列表 li>>定义无序列表与有序列表中的项 hr>>水平线 address>>定义文档作者或拥有者的联系信息 blockquote>>定义长的引用 pre>>定义预格式文本 form>>定义表单 fieldset>>定义围绕表单中元素的边框 legend>>定义 fieldset 元素的
MIKE笔记
2023/03/23
5.6K0
HTML布局标记和列表标记
首先要介绍的布局标记是div标记,div可以做网页的层也可以做网页的分区。当div做网页的层时可以实现漂浮在网页上的效果,就像我们经常可以在网站里看见的那些漂浮广告。div做网页的分区时,则是可以布置网页的格局,把一个网页分为多个模块,由这些模块结构来构建出一个网页。
端碗吹水
2020/09/23
4.2K0
HTML布局标记和列表标记
php去掉 HTML标记、javascript 代码、空白字符等
代码: preg_replace("'([\r\n])[\s]+'", "", $content) //去除回车换行符 // $document 应包含一个 HTML 文档。 // 本例将去掉
零式的天空
2022/03/02
1.5K0
HTML多媒体标记与框架标记
在html中可以使用多媒体标记来在网页上播放音频文件,或者显示一些好看的图片用来装饰网页。Flash文件也可以通过相应的标记显示在网页上,<video>标签是用于在网页上播放视频文件的。
端碗吹水
2020/09/23
3K0
HTML多媒体标记与框架标记
HTML标记之a标签
   1.内部链接(当前文档与目标文档在同一站点内)<a href=”目标文档位置及全称”></a>;    2.外部链接(当前文档与目标文档不在同一站点内)<a href=”URL(网址)”></a>;    3.E-mail链接(并允许访问者向指定的地址发送邮件)<a href=”mailto:电子邮件地址”></a>;    4.锚点连接 跳转到同一网页或其他文档的指定位置:创建锚点,<a name=”锚点名称”>显示内容</a>链接锚点,<a href=”(URL)#锚点名称”>显示内容</a>;    5.空链接,就是没有目标端点的链接,<a href=”#”>显示内容</a>;    6.脚本链接:是一种特殊的链接,当单击设置脚本链接的文本或图像时,可以运行相应的JS语句。
阿豪聊干货
2018/08/09
2.4K0
HTML单双标记
HTML标记的类型:单标记与双标记 一.单标记 (1).<标记名称> 单一型,无属性值。 如:<br/> 在xhtml中,规定,所有HTML标记,都要小写,所有的标记都要有关闭。 (2).<标记名称 属性="属性值"> 单一型,有属性值。 如:<hr width="80%"/> 二.双标记 (3).<标记名称>...</标记名称> 没有属性值。 如:<title>...</title> (4).<标记名称 属性=”属性值“>...</标记名称> 有属性。 如:<font color="pink">...</
十月梦想
2018/08/29
2.2K0
html常用标签标记
本博客所有文章如无特别注明均为原创。作者:十月梦想 ,复制或转载请以超链接形式注明转自 十月梦想博客 。 原文地址《html常用标签标记》
十月梦想
2018/08/29
1.6K0
HTML标记语法总结
         语法:<标记名>…标记内容…</标记名>,如:<a>这是百度的主页</a>
阿豪聊干货
2018/08/09
2.1K0
「  【PHP】PHP的标记风格(四种)  」
以上标记皆会输出标记 注:部分PHP版本中需要手动开启简短和ASP风格的标记(修改PHP.ini)修改后重启服务器环境即可
青益
2023/01/03
5490
PHP注释标记整理
在使用 phpDocumentor 等工具生成文档时, 会识别相关注释, 而且IDE也会识别, 在编码的过程中会给出提示.
烟草的香味
2019/07/25
2.1K0
HTML5基本标记
JaneYork
2023/10/11
1600
HTML标记之Form表单
从访问的Web站点的用户那里获得信息。访问者可以使用诸如文本域、列表框、复选框以及单选按钮之类的表单元素输入信息,然后单击某个按钮提交这些信息。是客户端与服务器端的交流途径。
阿豪聊干货
2018/08/09
2.5K0
HTML一些标记的认识
在HTML5中主要的特性之一就是减少网页对Flash的依赖,很多视频网站和网页游戏都依赖着Flash来运行,很多时候会发现,没有安装Flash就无法打开一些网页,运行Flash对浏览器压力比较大,使用HTML5就可以直接剔除Flash直接通过HTML5来播放视频或者运行网页游戏,这样可以很大程度减轻对浏览器的压力,并且网站开发人员维护起来也要方便得多。虽然HTML5出来有一段时间了,但是国内普遍还是使用着Flash,在国外的网站大部分都已经转用了HTML5,例如YouTube视频网站。
端碗吹水
2020/09/23
1.7K0
HTML一些标记的认识
容易被忽略的5个HTML技巧
对于所有 Web 开发人员来说,无论你选择的是哪种框架或后端语言,都需要大量使用 HTML(超文本标记语言)。
深度学习与Python
2021/03/12
1.2K0
HTML标记语法之列表元素
1.无序列表     <ul>        <li type=”项目符号类型”></li>        <li type=”项目符号类型”></li>        <li type=”项目符号类型”></li>         ……         <li type=”项目符号类型”></li>     </ul>     type的可取值:disc:●、circle:○、square:■. 2.有序列表 <ol type=”项目符号类型”start = “列表起点(为数字)” >        <l
阿豪聊干货
2018/08/09
1.8K0
HTML标记语法之表格元素
8.直列化格式:<colgroup><colgroup>(<col>与<colgroup>的功能完全一样)
阿豪聊干货
2018/08/09
2.2K0
HTML标记语言学习笔记
本文内容大多粘贴自www.w3school.com.cn/html/index.asp,详情可打开该网站查看,本人仅做简化整理。
Sidchen
2020/08/03
1.9K0
SQLMAP配合PHP中转忽略ssl
主要是我最近,沉迷挖洞(edusrc),然后就顺便的学习到了很多之前没接触过的一些东西,比如各类未授权访问啊,或者是各类信息泄露,最惨的还是当属 Rj45了,自认为严重的漏洞提交上去,下来后变成了低危哈哈哈
Elapse
2020/08/17
1.6K0
01_PHP基础——PHP标记与注释
PHP语法初步 PHP是一种运行在服务器端的脚本语言,可以嵌入到HTML中。 PHP代码标记 在PHP历史发展中,可以使用多种标记来区分PHP脚本 ASP标记:<% php代码 %> 短标记:<?
兮动人
2021/06/11
7800
01_PHP基础——PHP标记与注释
HTML标记语法之图片Img元素
语法:<img src=”xxx.jpg”alt=”xxx”title=”xxx”> 属性可取值如下: 属性名称 属性值 说明 src URL 图片路径 alt 文本 图片无法显示时的文本 title 文本 鼠标停留时显示的内容 width 像素/百分比 设置图片宽度 height 像素/百分比 设置图片高度 border 数字 设置图像边框 align     left 图片靠左,文字靠右 right 图片靠右,文字靠左 top 文字垂直居上靠
阿豪聊干货
2018/08/09
1.8K0

相似问题

html忽略额外的结束标记(如果存在

114

PHP (WP) -忽略HTML标记

116

PHP不会忽略html标记。

12

在IE中忽略HTML注释结束标记

20

强制在HTML段中添加结束标记或忽略缺少的结束标记

30
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文