2016-08-05 5 views
1

룩업에서봤을 때, 구문은 정확하지만 제 컴파일러 (VS2015)는 불평하고 있습니다. 참고, 네트워크 클래스와 함께 네임 스페이스 ee를 사용하고 있습니다. 코드는 다음과 같습니다.C++ 11 - 멤버 함수를 쓰레드에 전달하면 다음과 같은 결과가 나옵니다. 오버로드 된 함수가 2 개의 인수를 취하지 않습니다.

//code that doens't work 
    thread clientThread(&ee::Network::clientRun, new ee::Network); 

* 참고 : 실제 코드에서 나는 새로운 것을 인자로 부르지 않고 있습니다. 코드를 단축하기 위해 여기에서했습니다.

나는 기능을 테스트하고 작동하며 스레드를 사용하여 작동시키지 못한다. 여기에 그들의 서명이 있습니다.

void serverRun(); 
    void clientRun(); 
    void clientRun(string ip); 

내 오류는 다음과 같습니다

  1. 오류 C2661 '표준 : : 스레드 : 스레드'더 오버로드 된 함수가 2 개 인자

  2. 소요 ABC 생성자 "표준없이 예 :: thread :: thread "는 인수 목록과 일치합니다.

누가 어떤 일이 일어날 지에 대한 통찰력이 있습니까? 이 상황에서?

+1

은 아마도 그리 바보하지 질문, 당신은 바로''을 포함? 우리는 여기에서 할 일이별로 없습니다. – WhozCraig

+1

Visual C++ 오류 코드처럼 보입니다. 사용중인 버전은 무엇입니까? –

+3

또한 모호성 문제가 있습니다. try void (ee :: Network :: * threadProc)() = & ee :: Network :: clientRun; thread clientThread (threadProc, new ee :: Network); ' –

답변

3

벤의 제안으로 내 문제가 해결되었지만 확실하지 않습니다.

문제는 첫 번째 인수 인 &ee::Network::clientRun입니다. clientRun은 오버로드가 2 개 있지만 템플릿 차감 시점에서 (인수 유형을 std::thread::thread<>으로 추론하기 위해) 컴파일러는 오버로드 중 어느 것이 더 유효한지 구별 할 수있는 위치에 있지 않습니다. Network::clientRun의 유형을 지정하여 오히려 void (ee::Network*)(string) 동등하게 유효한 것보다 void (ee::Network*)(void)로 - 이전 호출에 캐스팅 그것을 위해 컴파일러의 작업을 수행했기 때문에

벤의 솔루션은했다.

몇 가지 예 :

#include <thread> 
#include <string> 

struct Network 
{ 
    void clientRun(); 
    void clientRun(std::string); 
}; 

int main() 
{ 
    // not ok... 
// std::thread clientThread(&Network::clientRun, new Network); 

    // ok - tells the compiler which overload 
    auto member_function = static_cast<void (Network::*)()>(&Network::clientRun); 
    std::thread clientThreadA(member_function, new Network); 

    // also ok 
    using call_type = void (Network::*)(); 
    std::thread clientThreadB(call_type(&Network::clientRun), new Network); 
}