2010-03-19 23 views
15

यदि मेरे पास लाइब्रेरी स्थानीय ऑब्जेक्ट्स के लिए परिभाषित कुछ ओवरलोडेड ओस्ट्रीम ऑपरेटर हैं, तो क्या उनके लिए std नेमस्पेस पर जाना ठीक है? अगर मैं उन्हें std नेमस्पेस में घोषित नहीं करता हूं, तो मुझे using ns:: operator << का उपयोग करना होगा।कौन सा नेमस्पेस ऑपरेटर << (स्ट्रीम) करता है?

संभावित अनुवर्ती प्रश्न के रूप में, क्या कोई ऑपरेटर मानक या वैश्विक नामस्थान पर जाना चाहिए?

उत्तर

24

कोएनिग लुकअप (सी ++ मानक 3.4.2) operator<< के अनुसार तर्कों के नामस्थानों में खोजा जाएगा। इसे std नामस्थान में घोषित करने की आवश्यकता नहीं है।

+0

इसलिए, यदि मेरे पास वैश्विक नामस्थान में बाहरी सी लाइब्रेरी से ऑब्जेक्ट/क्लास है, तो क्या मुझे ऑपरेटरों को वैश्विक नेमस्पेस में भी घोषित करना चाहिए? – Anycorn

+0

मुझे लगता है कि ऑपरेटर को नेमस्पेस में घोषित करना एक अच्छा विचार है जहां से इसकी तर्क है। –

2

आमतौर पर किसी नामस्थान (प्रकार, ऑपरेटरों, आदि ...) को घोषित करने का एक बुरा अभ्यास है जो आपके पास नहीं है। आपके पुस्तकालय का उपभोग करने वाले लोगों के लिए इसका अप्रत्याशित परिणाम हो सकता है। एक बेहतर समाधान है कि आप अपना नामस्थान परिभाषित करें और std और आपके नेमस्पेस को आयात करने के लिए जब आपको समाधान गठबंधन करना होगा।

7

सी ++ मानक स्पष्ट रूप से आपको std नेमस्पेस में अपनी संरचनाओं को घोषित करने से मना कर देता है।

+1

std :: स्वैप एक उल्लेखनीय अपवाद है। आपको विशेष रूप से std :: स्वैप का टेम्पलेट विशेषज्ञता प्रदान करने की अनुमति है, जो std namespace –

+5

'std :: swap' में रहना आवश्यक नहीं है अपवाद है। आप किसी भी मानक पुस्तकालय टेम्पलेट्स के लिए विशेषज्ञता प्रदान कर सकते हैं। –

21

operator<<(..., MyClass) उसी नामस्थान में MyClass के रूप में जाना चाहिए। आपको MyClass के इंटरफ़ेस के हिस्से के रूप में इसके बारे में सोचना चाहिए, भले ही यह एक गैर-सदस्य कार्य (अनिवार्य रूप से) हो।

संदर्भ के एक जोड़े:

  • मेरे लेख What's In a Class?
  • C++ Coding Standards मद 57: "एक प्रकार है और एक ही नाम स्थान में अपनी nonmember समारोह इंटरफ़ेस रखें।"
+0

सभी संबंधित चीजों को एक नामस्थान में डालने के नियम का अपवाद माई क्लास से संबंधित आंशिक विशेषज्ञता है, उदाहरण के लिए, std :: हैश, std :: less, std :: swap, आदि के लिए जो :: std :: में जाता है। – metal

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