【发布时间】:2025-11-28 23:35:02
【问题描述】:
我有一个类,其函数接受 std::function 并存储它。这部分似乎可以编译(但如果有任何问题,请指出)
#include <functional>
#include <iostream>
struct worker
{
std::function<bool(std::string)> m_callback;
void do_work(std::function<bool(std::string)> callback)
{
m_callback = std::bind(callback, std::placeholders::_1);
callback("hello world\n");
}
};
// pretty boring class - a cut down of my actual class
struct helper
{
worker the_worker;
bool work_callback(std::string str)
{
std::cout << str << std::endl;
return true;
}
};
int main()
{
helper the_helper;
//the_helper.the_worker.do_work(std::bind(&helper::work_callback, the_helper, std::placeholders::_1)); // <---- SEGFAULT (but works in minimal example)
the_helper.the_worker.do_work(std::bind(&helper::work_callback, &the_helper, std::placeholders::_1)); // <---- SEEMS TO WORK
}
我得到一个 segfault,但我不知道为什么。这个我以前用过,其实这个例子我是从别的地方复制过来的。成员函数的唯一真正区别是我调用它的类的一部分(即this 而不是the_helper)。
所以这就是为什么我还要问我是否还有其他什么做错了?就像我应该将std::function 传递为:
void do_work(std::function<bool(std::string)>&& callback)
或
void do_work(std::function<bool(std::string)>& callback)
【问题讨论】:
-
@AMA 抱歉 - typeo - 已修复
-
手工复制代码更大的问题是,当所有的错别字都被修正后,问题就不会再次出现coliru.stacked-crooked.com/a/f68ad0b1afc252f9
-
@StoryTeller 删除你在其中的
return false;并享受那个段错误:P @OP 你能确认一下吗? -
您花时间创建了问题的精简版。这是极好的。你做了可以说是最难的部分。但是您需要创建minimal reproducible example。只需您付出一点努力,您就可以获得一段我们可以复制粘贴和编译的代码。因为它是您的代码无法编译,您将失去愿意提供帮助但不愿意做您的部分的人 - 这是正确的方法。请帮助自己并创建一个 MCVE。
-
@Rakete1111 - 好吧,我把酒杯举到
-pedantic-errors
标签: c++ class c++11 function-pointers std-function