【问题标题】:No suitable conversion user-defined conversion with std::bind()没有合适的转换用户定义的转换与 std::bind()
【发布时间】:2018-11-09 19:40:07
【问题描述】:

我正在尝试实现一个 Button 类,该类在单击按钮时调用回调。

class Button
{
  public:
    void SetOnMouseClickCallback(std::function<void()> f);
  // Some other stuff
  private:
    std::function<void()> callback;
};
using ButtonPtr = std::unique_ptr< Button >;

void Button::SetOnMouseClickCallback(std::function<void()> f)
{
    callback = f;
}

在我的 App 类中,我想初始化所有按钮并最终为它们分配回调:

void App::Initialize()
{
    ButtonPtr b = std::make_unique<Button>(100.f, 100.f, 200.f, 50.f, "texture.jpg");
    b->SetOnMouseClickCallback(std::bind(&Foo)); // Error here under std::bind
}

void App::Foo()
{
    cout<<"bar";
}

我被困在这里一整天了,我已经不知道了。希望您能够帮助我。 提前致谢。

【问题讨论】:

    标签: c++ callback std stdbind


    【解决方案1】:

    Foo 不是void()。您忘记将其绑定到当前实例:

    std::bind(&App::Foo, this)
    

    【讨论】:

    • 是的!太感谢了!还要感谢@NathanOliver 的澄清!
    【解决方案2】:

    非静态成员函数有一个隐式函数参数帽子是要调用的对象。因此,您需要将要调用的对象传递给bind。这意味着你应该使用

    b->SetOnMouseClickCallback(std::bind(&Foo, this));
    

    如果要使用当前对象或

    App call_on;
    b->SetOnMouseClickCallback(std::bind(&Foo, &call_on));
    

    如果您希望它拥有自己的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多