【问题标题】:Callbacks with std::function带有 std::function 的回调
【发布时间】:2016-04-06 20:03:24
【问题描述】:

我收到一个带有 std::function 回调的编译错误。这是类声明:

class Cloud
{
// ...
public:
    Cloud (std::string end_point) : end_point(end_point) {}
    void operator() (std::function<void(rapidjson::Document)> callback);
};

我将回调存储在一个私有变量中,然后在我尝试调用回调的类的函数中,如下所示:

rapidjson::Document document;
this->callback(document);

这段代码给了我错误:

/Users/petilodie/Projects/TheGame/client/Classes/Cloud.cpp:67:20: Calling a private constructor of class 'rapidjson::GenericDocument<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>, rapidjson::CrtAllocator>'

我是 C++ 新手,我确定我在这里做错了什么。任何帮助表示赞赏。

【问题讨论】:

  • rapidjson::Document 不可复制。您需要通过引用将其传递给回调。

标签: c++ c++11


【解决方案1】:

在 C++11 之前,对外界禁用函数的唯一方法是将其标记为 private。在这种情况下,他们将 rapidjson::Document 的复制构造函数设为私有,以表示“此对象不可复制”。

要解决这个问题,您的回调应该通过引用获取文档:

void operator() (std::function<void(rapidjson::Document&)> callback);

【讨论】:

  • 谢谢!通过引用传递 arg 后代码编译成功,但我现在遇到另一个错误。 EXC_BAD_ACCESS,代码=EXC_i386_GPFLT。你知道这意味着什么吗? (我是在我的情况下问的)
  • 我不熟悉那个确切的错误,但听起来有些东西可能超出了范围。您应该附加调试器并隔离发生这种情况的位置,它可能与回调相关,也可能不相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多