2014-11-05 3 views
3

이 내가 서버 응답을받을 스레드를 사용하고자하지만, 작은 소켓 데모 주요 파일 나는 새로운 스레드를 만들려고 할 때 :오류 ++ THEAD

오류 메시지 :

error: no matching constructor for initialization of 'std::thread' 

코드를 :

#include <iostream> 
#include <thread> 
#include "client_socket.h" 
#include "socket_exception.h" 

void receive(ClientSocket client) 
{ 
    std::string reply; 
    while (true) { 
     client >> reply; 
     std::cout << "We received this response from the server:" << std::endl; 
     std::cout << "\"" << reply << "\"" << std::endl; 
    } 
} 

int main(int argc, const char* argv[]) 
{ 
    try { 
     ClientSocket client("127.0.0.1", 30000); 
     std::string sendBuf; 

     std::thread receiver(receive, client); 
     receiver.join(); 

     while (true) { 
      std::cout << "Enter string send to server:" << std::endl; 
      std::cin >> sendBuf; 
      if (sendBuf.compare("quit") == 0) { 
       break; 
      } 
      try { 
       client << sendBuf; 
      } catch (SocketException&) {} 
     } 
    } catch (SocketException& e) { 
     std::cout << "Exception was caught:" << e.description() << std::endl; 
    } 
    return 0; 
} 

사용 된 스레드에 문제가 있습니까? 덕분에

+0

어떤 컴파일러를 사용하고 있습니까? 이것은 [working ..] (http://coliru.stacked-crooked.com/a/8d14a8f14cc6f660)이어야합니다. –

+2

'ClientSocket' copy가 생성 가능합니까? – Sean

+1

@Sean 그렇지 않은 경우 스레드 생성자는 여전히 일치하는 singature를 갖지만 스레드 인수가 생성자 내부에서 복사되는 부분을 컴파일하는 데 실패합니다. 다른 오류 메시지가 표시됩니다. –

답변

1

지금까지 유효한 스레드 생성자 호출이 있다는 것을 알 수 있습니다. 1..N 임의의 인수에 대한 템플릿 생성자가 있기 때문입니다. 잘못된 인수는 해당 생성자 내부의 컴파일 오류로 이어지고 오류 메시지는 발생하지 않습니다. 가능한 다른 오류 (예 : 앞에서 정의한 함수에 대한 참조로 receive을 다시 인식하지 못하면 다른 오류 메시지가 나타납니다. std::thread 구현에 템플릿 기반 다중 인수 생성자가 존재하지 않는 것으로 보입니다.

IIRC 예전에는 std::thread 개의 구현에서 단 하나의 인수 만 사용했습니다. 예 : nullable callable 객체 또는 함수를 제공해야합니다. std::bind(receive, client)으로 전화하십시오. 이 경우 컴파일러를 최신 버전으로 업데이트해야합니다.

+0

입니다. C++ 11을 잊어 버리고, 이것을 cmakelist에 추가하십시오. 모두 괜찮습니다.'add_definitions (-std = C++ 11)' – NikSun

관련 문제