2011-11-17 2 views
1

다음부스트는 shared_ptr을 함께 noncopyable 오류를 바인딩 :: 내가 노력하고 <tcp::socket>

boost::shared_ptr<tcp::socket> socket(new tcp::socket(*io_service)); 

boost::bind(&function, *socket); // compiler error: noncopyable error 
function(*socket); // this works fine 

void 
function(tcp::socket & socket) 
{ 
    //do work 
} 

을 내가 부스트 : : 바인딩을 사용하여이 오류가 발생하는 이유는 무엇입니까?

는 나중에 다음과 같은 시도 :

boost::shared_ptr<tcp::socket> socket(new tcp::socket(*io_service)); 
boost::bind(&function, socket); //this works fine now 
void function(boost::shared_ptr<tcp::socket> socket) 
{ 
    asio::read_until(&socket, buffer, "end"); // compiler error: says i am passing an invalid argument 
} 

않는 이유는 지금은없는이 작품?

저는 C/C++ 프로그래밍의 기본 지식이 부족하다는 것을 알고 있습니다.

누구나 이와 같은 문제에 도움이되는 링크를 포함 할 수 있다면 좋을 것입니다.

답변

3

TCP : 소켓이 아닌 복사 가능한, 당신은 참조로 전달해야합니다 참조로 개최 부스트 :: 심판 객체에 랩 아마도 소켓 객체의 수명에 대해 걱정할 필요가 없으므로 두 번째 버전을 고수 할 것입니다.

boost::bind(&function, socket); 
void function(boost::shared_ptr<tcp::socket> socket) 
{ 
    asio::read_until(*socket, buffer, "end"); 
} 
+0

두 번째 방법의 문제점은 포인터이기 때문에 소켓을 읽을 수 없다는 것입니다. 나는 & socket_ptr을 사용하여 포인터 대신 소켓을 줄 것이라고 생각했다. 그것에 대해 어떻게 알아? – Takashi

+0

get()을 사용하여 포인터를 가져옵니다. 하지만 그것은 당신이 전달하고자하는 것이 아니며 소켓에 대한 참조를 전달하고자합니다. 내 편집 된 답변보기 – ronag

4

복사 할 수없는 개체를 복사하려고합니다.

boost::bind(&function, boost::ref(*socket)); 

당신은해야한다 :

boost::bind(&function, boost::ref(*socket));