ऐसा लगता है कि अनचाहे नामस्थानों का उपयोग करना केवल बाद में परेशानी के लिए पूछ रहा है जब कोई नया नामस्थान रखता है जो रूट स्तर नामस्थान के समान नाम होता है और रहस्यमय रूप से पूरे कार्यक्रमों के अर्थ को बदल देता है। तो, ::std::
के बजाय लोग हमेशा std::
क्यों कहते हैं। क्या वे वास्तव में कहने का मतलब रखते हैं "मैं जो भी std
उपयोग करना चाहता हूं, वह रूट नहीं है।"सभी लोग अनचाहे नेमस्पेस घोषणाओं का उपयोग क्यों करते हैं (यानी std :: not :: std: :)?
फ्रेड/Foo.h में:
#include <string>
namespace fred {
class Foo {
public:
void aPublicMember(const std::string &s);
};
} // end namespace fred
फ्रेड/Bar.h में:
namespace fred {
namespace std { // A standard fred component
class string { // Something rather unlike the ::std::string
// ...
};
} // namespace std
class Bar {
public:
void aPublicMember(std::string &s);
};
} // namespace fred
oops.cpp में
यहाँ मैं क्या मतलब का एक उदाहरण है:
#include <string>
#include "fred/Bar.h"
#include "fred/Foo.h" // Oops, the meaning of Foo is now different.
क्या लोग चाहते हैं, या मैं हूं मुझे कुछ याद आ रहा है?
और शायद आप कहें कि आपको कभी नामस्थान std
नाम नहीं देना चाहिए। और यह सब ठीक है और अच्छा है, लेकिन फिर कुछ अन्य रूट लेवल नेमस्पेस के बारे में क्या? क्या किसी भी रूट स्तर का नामस्थान किसी भी व्यक्ति को कभी भी परिभाषित करता है, हमेशा उप-नामस्थान नाम के लिए ऑफ-सीमा हो?
स्पष्टीकरण के लिए, मुझे कोई जवाब नहीं मिलेगा जो मुझे बताता है कि std
विशेष है क्योंकि मैंने इसे अभी एक उदाहरण के रूप में उपयोग किया है। मैं एक सामान्य मुद्दे के बारे में बात कर रहा हूं, और मैं इसका वर्णन करने के लिए std
का उपयोग कर रहा हूं, हालांकि मैं मानता हूं कि यह एक चौंकाने वाली प्रोप है।
मैं इसे स्वीकार करने जा रहा हूं क्योंकि यह वास्तविक उत्तर के सबसे नज़दीकी है। मुझे लगता है कि दूसरे को सिर्फ उच्च वोट दिया गया था क्योंकि यह मजेदार था। :-) मुझे संदेह है कि मुझे एक अलग उदाहरण चुना जाना चाहिए था, या मैंने इस तरह से सवाल नहीं पूछा था। – Omnifarious