2015-11-02 9 views
5

पर विचार के बाद दो using बयान:प्रकारों के उपयोग और उपयोग के बीच अंतर?

using ::space1::space2::MyType; 
using MyType = ::space1::space2::MyType; 

ऐसा लगता है कि using के बाद, दोनों तरीकों से हमें उपयोग MyType सीधे (किसी भी क्वालिफायर के बिना) की अनुमति देता है।

तो उपरोक्त दो के बीच क्या अंतर है?

+2

ठीक है, एक उदाहरण के रूप, दूसरी अभिव्यक्ति इस्तेमाल किया जा सकता उपनाम को परिभाषित करने के लिए 'Foo = Bar ' का उपयोग करके, जबकि पहला व्यक्ति नहीं कर सकता है। वैसे भी, पहले उदाहरण में आप एक मौजूदा नाम निर्यात कर रहे हैं, दूसरे में आप एक नया उपनाम बना रहे हैं। – skypjack

+0

पहला वाला एक [घोषणा का उपयोग करके] (http://en.cppreference.com/w/cpp/language/namespace#Using-declarations) जबकि दूसरा एक [नेमस्पेस उपनाम] है (http: //en.cppreference .com/डब्ल्यू/सीपीपी/भाषा/namespace_alias)। प्रश्न के शीर्षक के रूप में – crayzeewulf

+0

@ क्रेज़ेज़ुल्फ़ प्रकार का उल्लेख करता है, मैं कहूंगा कि दूसरा एक [टाइप उपनाम] (http://en.cppreference.com/w/cpp/language/type_alias) एनएस उपनाम के बजाए है। – Christophe

उत्तर

2

के रूप में टिप्पणी में कहा, पहले मामले में आप वास्तव में, एक जो using घोषणा-पत्र शामिल करने के लिए एक नाम स्थान में से कोई नाम निर्यात कर रहे हैं, जबकि दूसरे मामले में आप नाम स्थान में एक उपनाम है कि using बयान को परिभाषित कर रहे जो उस विशिष्ट नाम और इसके आस-पास के नामस्थान को इंगित करता है।

उदाहरण के लिए, दूसरा अभिव्यक्ति के साथ आप निम्नलिखित एक की तरह उपनाम परिभाषित कर सकते हैं:

using Foo = Bar<MyClass>; 

template <class C> 
using Foo = Bar<C, MyClass>; 

जबकि पहले using अभिव्यक्ति नहीं कर सकते, यह केवल कार्य करता है के नाम लोगों की तुलना में अलग स्थानों में उपलब्ध होने की यह बताने के लिए जिसमें उन्हें शामिल है।

घोषणाओं और उपनाम (प्रकार और टेम्पलेट वाले) का उपयोग करके निर्देशों का उपयोग करने के बारे में अधिक जानकारी के लिए here देखें।

1

पहला व्यक्ति आपको अयोग्य नाम से चर/प्रकार का संदर्भ देता है।

दूसरा एक नया नामांकन नामस्थान में नाम का नाम घोषित करता है।

1

रिकॉर्ड के लिए skypjack का अच्छा जवाब के अलावा, एक और अंतर है जब राज्य की परिभाषा कक्षा परिभाषा के अंदर उपयोग की जाती है।

एक वर्ग परिभाषा के अंदर, घोषणा का उपयोग कर, आधार वर्ग के एक सदस्य को पेश करेगा जबकि, प्रकार उर्फ ​​अभी भी एक प्रकार अन्य नाम है:

namespace space1 { namespace space2 { class MyType {}; } } 

struct s1 { 
    using ::space1::space2::MyType; // error 
    MyType b; 
}; 
struct s2 { 
    using MyType = ::space1::space2::MyType; // perfectly valid 
    MyType a; 
}; 
+0

आप बिल्कुल सही हैं, मैंने उन्हें मेरी प्रतिक्रिया में मेरी परिभाषा में कक्षा परिभाषा में संलग्न नहीं माना है। धन्यवाद। – skypjack

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