2012-01-19 17 views
41

मैं संभवतः सी ++ 11/टीआर 1 पुस्तकालयों का उपयोग करने के लिए बूस्ट :: एएसओ उदाहरणों में से एक को अनुकूलित करने की कोशिश कर रहा हूं। मूल कोड इस तरह दिखता है:क्या std :: bind boost :: asio के साथ संगत होना चाहिए?

void start_accept() 
{ 
    tcp_connection::pointer new_connection = 
    tcp_connection::create(acceptor_.get_io_service()); 

    acceptor_.async_accept(new_connection->socket(), 
     boost::bind(&tcp_server::handle_accept, this, new_connection, 
     boost::asio::placeholders::error)); 
} 

अगर मैं std::bind साथ boost::bind की जगह इस प्रकार है:

/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void' 

मैं हूं:

void start_accept() 
{ 
    tcp_connection::pointer new_connection = 
    tcp_connection::create(acceptor_.get_io_service()); 

    acceptor_.async_accept(new_connection->socket(), 
     std::bind(&tcp_server::handle_accept, this, new_connection, 
       boost::asio::placeholders::error)); 
     // std::bind(&tcp_server::handle_accept, this, new_connection, _1)); 
} 

मैं के साथ समाप्त होता है के साथ एक बड़ी त्रुटि संदेश मिलता है, बूस्ट संस्करण 1.47

के साथ जीसीसी संस्करण 4.4 का उपयोग करके मुझे बूस्ट :: बाइंड और std :: विनिमय करने योग्य होने के लिए बाध्य।

+0

std बूस्ट और tr1 से बहुत कुछ लेता है, लेकिन वे समान नहीं हैं। मुझे आश्चर्य है कि क्या इस [इस सवाल] के साथ कुछ करने के लिए है (http://stackoverflow.com/questions/6653531/workaround-to-allow-tr1function-to-swallow-return-values) – spraff

+0

एक [संभावित रूप से संबंधित] (https : //svn.boost.org/trac/boost/ticket/3053) टिकट –

+0

@ सैम मिलर मुझे टिकट मिला लेकिन इसे 3 साल तक अपडेट नहीं किया गया है! मैंने बूस्ट के v1.48 के खिलाफ यह भी प्रयास किया है, और boost :: asio :: प्लेसहोल्डर के बजाय std :: प्लेसहोल्डर्स का उपयोग करके। अभी के लिए मैं बूस्ट :: shared_ptr और boost :: asio कोड के लिए bind के साथ चिपक रहा हूँ। – mark

उत्तर

23

मैं अब एक समाधान

समस्या है कि जब मैं पहली बार मैं अभी भी std::bind साथ boost::asio::placeholders उपयोग कर रहा था std::bind और std::shared_ptr करने के लिए स्विच करने की कोशिश की, इस टेम्पलेट संकलक त्रुटियों की एक बड़ी राशि में हुई तो है, मैंने फिर टुकड़े टुकड़े स्विच करने की कोशिश की।

मैं पहली बार स्विचिंग सिर्फ boost::shared_ptrstd::shared_ptr करने की कोशिश की, इस विफल हो गया क्योंकि boost::bindstd::shared_ptr (देखें: How to resolve conflict between boost::shared_ptr and using std::shared_ptr?) के लिए टेम्पलेट get_pointer<typename T> की विशेषज्ञता के बाहर के साथ std::shared_ptr साथ काम नहीं करेंगे।

std :: shared_ptr पर स्विच करने के बाद मैं std::bind पर स्विच किया, इस बार std::placeholders, (धन्यवाद रिचर्ड) का उपयोग करके उदाहरण कोड अब संकलित करता है और सही तरीके से काम करता है।

आदेश boost::asio साथ std::bind उपयोग करने के लिए सुनिश्चित करें कि std::shared_ptr और std::placeholders भी उपयोग किया जाता है बनाते हैं।

+0

ध्यान दें कि आम तौर पर बूस्ट से std :: bind पर स्विच करते समय, std :: shared_ptr कड़ाई से जरूरी नहीं है। केवल प्लेसहोल्डर आवश्यक हैं क्योंकि std :: bind विशेष रूप से उनके लिए खोजेगा। – Whanhee

+1

शायद उल्लेख करने की आवश्यकता है कि boost :: asio :: प्लेसहोल्डर्स :: त्रुटि को std :: प्लेसहोल्डर :: _ 1 के साथ प्रतिस्थापित करने की आवश्यकता है। यह पोस्ट देखें: https://stackoverflow.com/a/28521715/5058676 – evaitl

संबंधित मुद्दे