std::bind: error: too few arguments to function call, single argument was not specified

std::bind: error: too few arguments to function call, single argument was not specified

我有以下代码:

void MyClass::create_msg(MyTime timestamp) {
   // do things here ...
}

并且我尝试为上述函数创建一个 std::bind:

MyMsg MyClass::getResult(MyTime timestamp) {
   // do things here ...
   std::bind(create_msg(), timestamp);
   // do things ...
}

但出现以下错误:

error: too few arguments to function call, single argument 'timestamp' was not specified
    std::bind(create_msg(), timestamp);
              ~~~~~~~~~~ ^
MyClass.cpp:381:1: note: 'create_msg' declared here
void MyClass::create_msg(MyTime timestamp) {
^
1 error generated.

在这种情况下我做错了什么?谢谢!

顺便说一句,如果我这样做,同样的错误:

std::bind(&MyClass::create_msg(), this, timestamp);

这里有三个问题。

首先,您给 std::bind 作为函数的参数当前是 create_msg()。这意味着 "call create_msg, take whatever result it produces, and pass that in as the first argument to std::bind." 这不是你想要的 - 你的意思是 "take create_msg and pass it as the first parameter to std::bind." 因为 create_msg 是一个成员函数,你需要像这样得到一个指向它的指针:

std::bind(&MyClass::create_msg, /* ... */)

这将解决一个问题,但随后会弹出另一个问题。当您将 std::bind 与成员函数指针一起使用时,您需要证明 std::bind 具有与调用该成员函数时要使用的接收者对象对应的额外参数。我相信在你的情况下,你希望当前对象成为接收者,它看起来像这样:

std::bind(&MyClass::create_msg, this, timestamp)

那应该可以正常工作。

然而,有人可能会争辩说这里还有第三个问题 - 与其使用 std::bind,不如使用 lambda 表达式?

[timestamp, this] { create_msg(timestamp); }