2013-03-06 9 views
5

मैं एक बहुत बड़ी परियोजना पर काम कर रहा हूं और एक फ़ाइल में हम सभी को अचानक संकलन-समय त्रुटि मिली जहां संकलक को लगता है कि winsock.h पर हमारा कॉल bind() वास्तव में std::bind() पर कॉल है। ऐसा लगता है कि फ़ाइल में शामिल कहीं भी using namespace std कोड स्निपेट है। हम कोशिश कर सकते हैं और यह पता लगा सकते हैं कि इन using namespace std उपयोग में हैं और उन्हें हटा दें, लेकिन शायद ऐसा करने का एक बेहतर तरीका है?std :: bind और winsock.h बाइंड भ्रम

+0

नामस्थान मजेदार हैं वे नहीं हैं? –

+4

नहीं, बस इसे हटा दें। – inf

+2

'नामस्थान std' का उपयोग करके निकालें, अन्यथा आपको किसी अन्य नाम के साथ भविष्य में कभी भी एक ही समस्या होगी। क्यों समझाए जाने के लिए – juanchopanza

उत्तर

15

वैश्विक नामस्थान निर्दिष्ट करने के लिए आप ::bind() का उपयोग करने के लिए अपनी कॉल बदल सकते हैं।

7

हां, यह दुर्भाग्यपूर्ण है। मैं http://gcc.gnu.org/ml/libstdc++/2011-03/msg00143.html में वर्णित है std::bind टेम्पलेट एक बेहतर मुकाबला नहीं है जब तक आप बिल्कुल सही तर्क प्रकारों का उपयोग करें:

समस्या सॉकेट बाँध() फ़ंक्शन इस हस्ताक्षर किया है:
int bind(int, const sockaddr*, socklen_t);
तो में कॉल गैर-कॉन्स्ट पॉइंटर का उपयोग करने वाला उदाहरण पाता है कि विविधता टेम्पलेट std :: बाइंड एक बेहतर मिलान है। ऐसा ही होगा यदि तीसरा तर्क socklen_t को छोड़कर कोई अभिन्न प्रकार था।

आपका कोड जीसीसी के साथ काम करेगा, क्योंकि मैं इस अस्पष्टता को रोकने के लिए जीसीसी के std::bind करने के लिए एक अनुरूप एक्सटेंशन जोड़, अधिभार सेट से std::bind को हटाने यदि पहला तर्क "सॉकेट की तरह", जो मैं is_integral का उपयोग कर परिभाषित किया गया है द्वारा और is_enum। हालांकि यह अन्य कार्यान्वयन के साथ मदद नहीं करता है।

using namespace std; निकाला जा रहा है एक अच्छा विचार वैसे भी है, लेकिन bind() को एक अयोग्य कॉल ऐसा होता है एक प्रकार नाम स्थान std (जैसे std::size_t के रूप में) में परिभाषित उपयोग करने के लिए है, क्योंकि अभी भी तर्क निर्भर देखने से std::bind मिल सकता है पूरी तरह से पर्याप्त नहीं हो सकता है। जोनाथन पॉटर का जवाब आपको सही कार्य सुनिश्चित करने का सबसे अच्छा तरीका है: इसे ::bind के रूप में योग्य बनाएं।

+0

+ 1। –

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