【问题标题】:Qt and std::bindQt 和 std::bind
【发布时间】:2013-08-11 15:14:04
【问题描述】:

我正在尝试在 Qt 5.1 和 MSVC 2010 中使用 std::bind 将 QNetworkReply 事件挂钩到成员函数,同时将回复作为参数传递。直接将 std::bind 放在连接行中失败,在 MSVC 2010 上出现大量模板错误,但使用 std::function 将其分为两行。我很想坚持一条线。有什么神奇的咒语可以做到这一点?

void MyClass::doRequest ( )
{

    ..

    QNetworkReply * reply = nam.get(...)

    // next line fails on MSVC 2010
    connect(reply, &QNetworkReply::finished, std::bind(&MyClass::onNetworkDone, this, reply));

    // next two lines do work on MSVC 2010  
    std::function<void ()> a = std::bind<void()>(&MyClass::onNetworkDone, this, reply);
    connect(reply, &QNetworkReply::finished, a);
}

void MyClass::onNetworkDone( QNetworkReply * reply )
{
    ..
}

【问题讨论】:

  • 2 行解决方案可以编译,但它有效吗?我相信 bind 的结果必须存储在一个永久容器中,该容器在调用函数时不能被删除。单行解决方案无法编译,因为编译器看到您做错了什么,无论在另一种情况下您是否屏蔽它。也许我完全错了。

标签: qt qt5 qnetworkaccessmanager visual-studio-2010 stdbind


【解决方案1】:

您需要将绑定强制转换为函数指针:

connect(reply, &QNetworkReply::finished, (void(*)()) std::bind(&MyClass::onNetworkDone, this, reply));

这回答了你的问题。但是,由于上述评论中讨论的原因,我不确定它不会在运行时崩溃。

【讨论】:

    猜你喜欢
    • 2014-12-17
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多