2012-04-05 9 views
9

विफल रहता है, मैं नई libcxx लाइब्रेरी का उपयोग कर रहा हूं और मेरे पास एक कोड है जो सॉकेट फ़ंक्शन bind() पर कॉल करता है। समस्या यह है कि जब मैं using namespace std; टाइप संकलक मेरा पीछा कोड के लिए त्रुटि देता है:libcxx के साथ सॉकेट फ़ंक्शन बाइंड() का उपयोग करने वाला कोड संकलित

int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr)); 

बजना (SVN निर्माण) का उपयोग कर त्रुटि:

error: no viable conversion from '__bind<int &, sockaddr *, unsigned long>' to 'int' 
int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr)); 

मुझे लगता है कि समस्या यह है कि using namespace std; है कि शीर्षलेख <functional> से दायरे में std::bind() फ़ंक्शन लाता है (हालांकि हेडर शामिल नहीं है)। चूंकि मैं एक थर्ड पार्टी लाइब्रेरी का उपयोग कर रहा हूं जो पूरे नामस्थान std का उपयोग करता है, मैं वर्ग नामों को पूरी तरह से योग्य नामों में आसानी से नहीं बदल सकता।

मैं सोच रहा था कि क्या यह पुस्तकालय की या कि क्या वहाँ सी ++ 11 में कुछ नए नियम है कि संभावित एक पुराने कोड bind() का उपयोग करता है तोड़ सकता हैं कार्यान्वयन में एक समस्या है। इस पर किसी भी विचार की सराहना की जाएगी।

धन्यवाद

रोमन

+0

जब आप कहते हैं कि तीसरी पार्टी लाइब्रेरी संपूर्ण नेमस्पेस std का उपयोग करती है तो आपका क्या मतलब है? – Troubadour

+0

मेरा मतलब है कि इसमें कुछ फाइलों में 'नेमस्पेस std;' का उपयोग किया गया है। –

+0

संभावित रूप से केवल स्रोत फ़ाइलों में और शीर्षकों में नहीं? इससे आपको बिल्कुल प्रभावित नहीं होना चाहिए। – Troubadour

उत्तर

27

यह पुस्तकालयों को लागू करने में एक समस्या नहीं है। सी ++ 11 ने अपना खुद का std::bindnamespace std में फ़ंक्शन पेश किया, जिसका उपयोग कार्यों के लिए पैरामीटर को बाध्य करने और उच्च-ऑर्डर प्रोग्रामिंग का समर्थन करने के लिए किया जाता है।

namespace std होने का कारण नई लाइब्रेरी फ़ंक्शंस और कक्षाओं को मौजूदा कोड में परिवर्तनों को तोड़ने से रोकने में मदद करना है। इसका कारण यह है कि सब कुछ का नाम std:: से शुरू होता है, जो नाम टकराव को रोकता है।

हालांकि, अगर आप अपने कार्यक्रम में using namespace std; लिखते हैं, आप अपने आप को इस तरह की क्षमता को तोड़ने परिवर्तन करने के लिए उजागर कर रहे हैं, मुक्त समारोह bind और समारोह std::bind जरूरी disambiguated नहीं किया जा सकता क्योंकि।

इसे ठीक करने के लिए आपको स्पष्ट है कि यह वैश्विक नामस्थान में है बनाने के लिए bind::bind के रूप में कॉल कर सकते हैं, या आप इस कार्यक्रम के शीर्ष पर using namespace std; निकाल सकते हैं।

आशा है कि इससे मदद मिलती है!

+0

बहुत बहुत धन्यवाद .. यह बहुत अच्छा काम कर रहा है !! – RajibTheKing

+1

आखिरकार मुझे समझ में आया कि बांध वापस नहीं आ रहा है। – viktike

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

  • कोई संबंधित समस्या नहीं^_^