मैं namespace a { ... }
ब्लॉक के भीतर नामस्थान में होने वाले सभी कोड को घेरने के लिए अधिक उपयुक्त मानता हूं, जैसा कि है अर्थात् आप क्या कर रहे हैं: आप a
नामस्थान के भीतर तत्वों को परिभाषित कर रहे हैं। लेकिन अगर आप केवल सदस्यों को परिभाषित कर रहे हैं तो दोनों चीजें काम करेंगे।
संकलक void my::foo()
पाता है, यह निर्धारित करने के लिए क्या my
है की कोशिश करेंगे, और यह using a::my
मिलेगा, कि से my
को हल करने और समझते हैं कि आप a::my::foo
विधि को परिभाषित कर रहे हैं।
दूसरी ओर इस दृष्टिकोण अगर तुम मुक्त कार्यों का उपयोग कर रहे असफल हो जायेगी:
// header
namespace a {
class my { // ...
};
std::ostream & operator<<(std::ostream& o, my const & m);
}
// cpp
using a::my;
using std;
ostream & operator<<(ostream & o, my const & m) {
//....
}
संकलक खुशी से एक कार्यक्रम में उपरोक्त कोड का अनुवाद होगा, लेकिन क्या यह वास्तव में क्या कर रही है शीर्षक में std::ostream& a::operator<<(std::ostream&, a::my const &)
की घोषणा कर रहा है फ़ाइल - कार्यान्वयन के बिना-, और cpp फ़ाइल में std::ostream& ::operator<<(std::ostream &, a::my const &)
को परिभाषित करना, जो एक अलग कार्य है। Koening देखने, जब भी संकलक प्रकार a::my
की obj
साथ cout << obj
देखता है का उपयोग करना, संकलक cout
और my
(std
, और a
) की संलग्नित नामस्थान में दिखेगा और है कि वहाँ एक a::operator<<
घोषित लेकिन namespace a
में परिभाषित किया गया कभी नहीं मिलेगा। यह संकलित होगा लेकिन आपके कोड को लिंक नहीं करेगा।
स्रोत
2010-04-11 13:50:53
+1। नेमस्पेस में क्या है 'नेमस्पेस {} 'में है। इस तरह की चीजें इंडेंटेशन की मांग नहीं करती हैं इसलिए वास्तव में कोई परेशानी नहीं है। – Potatoswatter