2011-07-01 9 views
6

मैं कुछ सी ++ कोड संकलित करने के लिए जी ++ 4.6.0 का उपयोग कर रहा हूं जो पहले के संस्करणों में सफलतापूर्वक संकलित किया गया था।sys/sockets.h और std :: bind में बाइंड() के बीच अंतर कैसे करें?

if (bind(iControl, (struct sockaddr *) &sa, sizeof(sa)) == -1) 
    throw runtime_error ("bind"); 

जहां iControl एक सॉकेट है, और सा एक struct sockaddr_in है।

हालांकि, जी ++ 4.6 में मैं निम्नलिखित त्रुटि मिलती है:

comms.cpp:93:66: error: no match for ‘operator==’ in ‘std::bind(_Functor&&, _ArgTypes&& ...) [with _Functor = int&, _ArgTypes = {sockaddr*, long unsigned int}, typename std::_Bind_helper<_Functor, _ArgTypes>::type = std::_Bind<int(sockaddr*, long unsigned int)>]((* &((sockaddr*)(& sa))), (* &16ul)) == -0x00000000000000001’ 

comms.cpp: 93: 66: ध्यान दें: उम्मीदवार हैं:

पेज और संभव उम्मीदवारों की एक आधा के बारे में के बाद ।

यह sys/sockets.h में functional में std :: bind के साथ बांध कार्य को मिलाकर प्रतीत होता है। using namespace std को हटाने के लिए मैं अपनी पूरी स्रोत फ़ाइल को फिर से लिखने के बिना दोनों को कैसे असंबद्ध कर सकता हूं?

+11

जानना चाहते हैं कि 'नेमस्पेस std का उपयोग क्यों करें;' इतना अच्छा विचार नहीं है? :-) –

+0

ओपनसीवी का उपयोग करते समय भी इसी तरह के मुद्दे बढ़ सकते हैं। –

+1

@ बॉपरसन मैंने पाया होगा क्यों: पी लेकिन यह कोड मेरी रक्षा में मुझे बताता है। –

उत्तर

18

इसे वैश्विक होने के योग्य बनाएं: ::bind(...) (और सुनिश्चित करें कि आपके पास सभी सही शीर्षलेख शामिल हैं)।

संपादित करें: (मैं @Bo पेरसन की टिप्पणी से विचार आया) एक और ठोस विकल्प की तरह कई using <thing> को using namespace std; बदलने के लिए है:

using std::cout; 
using std::endl; 
using std::string; 
// etc. 

यह आपका पुराना कोड संकलन की सुविधा देता है और में std::bind नहीं लाती वैश्विक नामस्थान।

+0

में कोड ब्रेक है, मैं आज सुबह यह समस्या महसूस कर रहा हूं। यह _Bind_helper कहां से आ रहा है और इस संदर्भ में "नामस्थान std का उपयोग क्यों कर रहा है"? –

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