gpt4 book ai didi

C++ Lambda - 错误 : no matching function for call to

转载 作者:行者123 更新时间:2023-12-02 03:01:40 25 4
gpt4 key购买 nike

我试图将 lambda 作为参数传递给函数,但是一旦我尝试访问 lambda 内部在外部声明的变量,构建就会失败:error: no matching function for call to 'AWS::subscribe(char [128], mainTask(void*)::<lambda(AWS_IoT_Client*, char*, uint16_t, IoT_Publish_Message_Params*, void*)>)'

我以为 [&]将负责捕获变量。我也尝试过[=]以及 [someVar] , [&someVar] .

我正在使用 C++11。

char someVar[128];

aws->subscribe(
topic,
[&] (AWS_IoT_Client *pClient, char *topicName, uint16_t topicNameLen, IoT_Publish_Message_Params *params, void *pData) {
char *text = (char *)params->payload;
sprintf(someVar, "%s", text);
}
);

来自 AWS 库:

void AWS::subscribe(const char *topic,
pApplicationHandler_t iot_subscribe_callback_handler) {
m_error =
::aws_iot_mqtt_subscribe(&m_client, topic, (uint16_t)std::strlen(topic),
QOS1, iot_subscribe_callback_handler, NULL);

}

最佳答案

问题是 AWS::subscribe 函数需要函数指针,而不是 lambda。无捕获的 lambda 可以转换为函数指针,但有捕获(即状态)的 lambda 则不能。

您可以在签名中看到对此问题的“传统”解决方案:有一个 void* 参数,您应该将所有回调特定的数据打包到其中。据推测,这是您当前设置为 NULLaws_iot_mqtt_subscribe 的最后一个参数(最好使用 nullptr 顺便说一句)。

这比使用 lambda 更难看,但它基本上是 C 兼容库接口(interface)的唯一选择:

// Your callback (could also be a capture-less lambda):
void callbackFunc(/* etc. */, void *pData)
{
std::string* someVarPtr = static_cast<std::string*>(pData);
char *text = (char *)params->payload;
sprintf(*someVarPtr, "%s", text);
}

// To subscribe:
std::string someVar;
void* callbackData = &someVar; // Or a struct containing e.g. pointers to all your data.
aws_iot_mqtt_subscribe(/* etc. */, callbackFunc, callbackData);

关于C++ Lambda - 错误 : no matching function for call to,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52190078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com