2013-08-11 5 views
3

Qt 5.1 및 MSVC 2010에서 std :: bind를 사용하여 응답을 매개 변수로 전달하면서 QNetworkReply 이벤트를 멤버 함수에 연결하려고합니다. 직접 연결선에 std :: bind를 두는 것은 MSVC 2010에서 많은 템플릿 오류로 실패하지만 std :: function을 사용하여 두 줄로 분할합니다. 나는 한 줄을 고집하고 싶다. 이것이 일어날 수있는 마법의 주문은 무엇입니까?Qt 및 std :: bind

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

이이 질문에 대한 답 :

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) 
{ 
    .. 
} 
+1

2 줄 솔루션이 컴파일되지만 작동합니까? 바인딩 결과는 함수가 호출 될 때 삭제되지 않아야하는 영구 컨테이너에 저장되어야한다고 생각합니다. 컴파일러가 당신이 뭔가 잘못하고 있다고 생각하기 때문에 한 줄의 솔루션은 컴파일되지 않습니다. 어쩌면 나는 완전히 틀리다. – galinette

답변

2

당신은으로 함수 포인터에 바인드를 캐스팅해야합니다. 그러나 위의 설명에서 설명한 이유 때문에 런타임에 충돌이 발생하지 않을지 잘 모르겠습니다.

관련 문제