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

为什么STD::BIND不能解析具有多个参数的函数重载?

邓俊材
2023-03-14

考虑以下示例

#include <iostream>
#include <functional>

using namespace std;

void f(int x,int y) {}
// void f(int x) {} // if this line is uncommented, code does not compile.

int main() {
    auto functor = std::bind(&f,1,placeholders::_1);
    cout << "works!" << endl;
    return 0;
}

共有1个答案

平学
2023-03-14

当C++编译器看到调用std::bind(&f,1,placeholders::_1)时,它不知道参数之间的任何关系。关系只有在模板实例化时才可见。为了实例化它,编译器需要模板参数。但是&f是一个重载函数,因此它没有定义类型。因此,C++编译器无法实例化模板,甚至在可以看到任何关系之前编译就失败了。

您可以通过明确指定类型来解决此问题:

std::bind(static_cast<void(*)(int,int)>(&f),1,placeholders::_1);
 类似资料:
  • 我有两个函数的重载,它们采用不同的s,当与的结果一起使用时,会导致后者的歧义问题。我不明白为什么只有这是模棱两可的。 将< code>int()与< code>bind函数一起使用时,我得到一个模糊错误 gcc-5.1错误(类似的还有clang) 然而,以下所有工作 查看构造函数 对我来说,任何在不同的类型上具有多个重载的函数都应该有歧义,但这只是绑定调用的问题。然后我想“也许有一些神奇的事情发生

  • 一个 C 函数可以有多个参数包。虽然它看起来不是很实用,但了解它们的语言规则仍然很有趣。 例如,在两个过载的情况下: 不带参数 在 MSVC 中选择版本 1,在 Clang 中选择版本 2,在 GCC 中选择。 如果使用参数调用,则MSVC和GCC都选择版本1,而Clang仍然选择版本2。 演示:https://gcc.godbolt.org/z/PWr6h1dn1 哪个编译器就在这里? 有一个类

  • 我在尝试用std::function和std::bind绑定方法时遇到了一个问题。 在我的通信服务类中: CommunicationService::ManageGetRequest签名: BindGET签名: 请求函数类型定义: BindGET上的错误: 错误C2664:“void RESTServer::BindGET(RequestFunction)”:无法从“std::\u Binder”

  • 谁能告诉我为什么函数参数不能是?这是函数参数在上声明并在函数返回时被取消分配的原因吗?没有办法保留参数值?只是糊涂了。请澄清。 多谢了。

  • 预计此函数将无法typeCheck。然而,没有解释发生这种情况的原因。在GHCI中试用时,我得到了以下输出: 为什么会出现这种情况?

  • 请考虑以下代码示例: 我确信它不应该编译,因为编译器不应该能够选择两个构造函数中的一个。g-4.7.3显示了这个预期的行为:它说重载构造函数的调用是不明确的。但是,g-4.8.2成功编译了它。 此代码在 C 11 中是否正确,或者它是此版本 g 的错误/功能?