2009-03-08 10 views
17

के भीतर एक वर्ग को परिभाषित करना इस की तुलना में एक नाम स्थान में एक वर्ग को परिभाषित करने के लिए एक और अधिक संक्षिप्त तरीका है:एक namespace

namespace ns { class A {}; } 

मैं की तरह class ns::A {}; काम करेगा कुछ उम्मीद कर रहा था, लेकिन अफसोस नहीं।

उत्तर

32

तुम पास, आप नाम स्थान में वर्ग घोषित अग्रेषित कर सकते हैं और फिर इसे परिभाषित के बाहर अगर आप चाहते हैं:

namespace ns { 
    class A; // just tell the compiler to expect a class def 
} 

class ns::A { 
    // define here 
}; 

क्या आप ऐसा नहीं कर सकते सदस्यों के बिना नाम स्थान में वर्ग को परिभाषित और फिर परिभाषित है नामस्थान के बाहर कक्षा फिर से। यह एक परिभाषा नियम (या somesuch बकवास) का उल्लंघन करता है।

+0

धन्यवाद। यह अधिक संक्षिप्त नहीं है लेकिन ऐसा लगता है कि यह समझ में आता है। –

+1

मुझे नहीं लगता कि वास्तव में 'नेमस्पेस एनएस {कक्षा ए {} से अधिक संक्षिप्त या पठनीय संस्करण है; } 'लेकिन शायद यह सिर्फ व्यक्तिगत राय है। –

+0

यह घोषणा और परिभाषा को अलग करता है। – Shaowu

0

नहीं आप नहीं कर सकते। सी ++ मानक के शब्दों में, खंड 3.3.5:

एक नाम सभी नामित या अनाम नेमस्पेस (7.3) के बाहर की घोषणा की, ब्लॉक (6.3), आनन्द (8.3.5), समारोह परिभाषाओं (8.4) और वर्गों (खंड 9) वैश्विक नामस्थान गुंजाइश

तो घोषणा एक नाम स्थान ब्लॉक के अंदर होना चाहिए है - परिभाषा निश्चित रूप से यह बाहर हो सकता है।

+0

, वर्ग एक {}; एक परिभाषा है, घोषणा नहीं। क्या आप वाकई उद्धरण लागू हैं, तो? –

+0

परिभाषाएं घोषणाएं हैं –

+0

उम जो अच्छी तरह से सोचा नहीं गया था - लेकिन मुझे यकीन है कि उद्धरण लागू होता है - मैं एक और रूप ले जाऊंगा। –

2

अनुभाग आप पढ़ किया जाना चाहिए यह है:

7.3.1.2 नामस्थान सदस्य परिभाषाओं

3 हर नाम पहली बार एक नाम स्थान में घोषणा की है कि नाम स्थान का एक सदस्य है [...। ]

शब्द को नोट करें - घोषणा डी। शॉली (और उसका उदाहरण) सही है।

7

आप ऐसा कर सकते हैं, लेकिन यह वास्तव में अधिक सटीक नहीं है।

namespace ns { 
    class A; 
} 

class ns::A { 
}; 

या

namespace ns { 
    class B; 
} 

using ns::B; 
class B { 
}; 
अच्छी तरह से
संबंधित मुद्दे