当前位置: 首页 > 知识库问答 >
问题:

Bind std::函数错误

何烨华
2023-03-14

我在尝试用std::function和std::bind绑定方法时遇到了一个问题。

在我的通信服务类中:

this->httpServer->BindGET(std::bind(&CommunicationService::ManageGETRequest, this, std::placeholders::_1));

CommunicationService::ManageGetRequest签名:

MessageContent CommunicationService::ManageGetRequest(std::string uri, MessageContent msgContent)

BindGET签名:

void RESTServer::BindGET(RequestFunction getMethod)

请求函数类型定义:

typedef std::function<MessageContent(std::string, MessageContent)> RequestFunction;

BindGET上的错误:

错误C2664:“void RESTServer::BindGET(RequestFunction)”:无法从“std::\u Binder”转换参数1

之前,我的请求函数是这样的:

typedef std::function<void(std::string)> RequestFunction;

它工作得很好。(当然,所有签名方法都已调整)。

我不明白是什么导致了这个错误。

共有1个答案

富昕
2023-03-14

改变

this->httpServer->BindGET(
  std::bind(&CommunicationService::ManageGETRequest, this, std::placeholders::_1)
);

this->httpServer->BindGET(
  [this](std::string uri, MessageContent msgContent) {
    this->ManageGETRequest(std::move(uri), std::move(msgContent));
  }
);

使用std::bind几乎总是一个坏主意。lambda解决了同样的问题,而且几乎总是做得更好,并提供更好的错误消息。在std::bind具有lambda特性的少数情况下,C 14没有涵盖这些特性。

std::bind是在lambda之前的c11中作为boost::bind编写的,然后与lambda同时纳入标准。当时,lambdas有一些限制,因此std::bind是有意义的。但这并不是lambdas C 11限制出现的情况之一,而且随着lambda在此后的发展,学会使用std::bind在这一点上显著降低了边际效用。

即使你掌握了std::bind,它也有很多恼人的怪癖(比如传递一个bind表达式来绑定),避免它也有好处。

您还可以通过以下方式进行修复:

this->httpServer->BindGET(
  std::bind(&CommunicationService::ManageGETRequest, this, std::placeholders::_1, std::placeholders::_2)
);

但我认为你不应该。

 类似资料:
  • 好吧,为了大学,我正在做一些SQL作业,但是我不知道这里有什么问题...坚持了几个小时。 所以在这里我创建了一个函数: 然后我尝试插入一个新行: 继续获取此错误: 错误:函数ins_notitie(未知,带时区的时间戳,未知,带时区的时间戳)不存在 第1行:选择ins_notitie('100001',now(),'Test note',now()) 错误:函数ins_notitie(未知,带时区

  • 问题内容: 此SQL: 产生以下错误: 参数数据类型varchar对于格式函数的参数1无效。 是一个 运行SQL Server 2012 问题答案: 不支持作为的第一个参数。支持的数据类型的唯一类别是和。 你可以做 来自levelonehuman的评论:文档

  • 我有碱基错配的DNA扩增子,这可能会在PCR扩增过程中出现。我感兴趣的是,给定每个碱基的错误率、错配数和扩增子中碱基的数量,序列包含错误的概率是多少。 我偶然看到一篇文章[Cummings,S.M.et al(2010).群体遗传分析中PCR、克隆和测序错误的解决方案.保守遗传学,11(3),1095-1097.DOI:10.1007/S10592-009-9864-6]提出了在这种情况下计算概率

  • 运行下面的函数时,出现以下错误: Invoke-Command:无法验证参数“ComputerName”上的参数。参数为null或为空。请提供一个不为null或空的参数,然后重试该命令。位于C:\ Users \ username one \ Desktop \ script . PS1:16 char:29 Invoke-Command-computer name 你知道我做错了什么吗?

  • 本文向大家介绍PHP错误处理函数,包括了PHP错误处理函数的使用技巧和注意事项,需要的朋友参考一下 在 PHP 中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。 PHP 错误处理 在创建脚本和 Web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。 本教程介绍了 PHP 中一些

  • 我有一个继承自父类Point的子类行,我没有在子类中使用基类的构造函数,但是我得到了这个错误: '形状。点“不包含接受0个参数的构造函数 这是我的父类: 这是我的孩子班: