2012-07-25 8 views
20

मैं इस तरह एक वर्ग है कहते हैं:नाम स्थान में आयात करें नेस्ट कक्षाएं सी ++

class A { 
public: 
    class B { 
     // ... 
    }; 
    static void f(); 
    // ... 
}; 

मैं B को A::B रूप A::f() रूप f() देखें और कर सकते हैं, लेकिन मैं B और f() आयात कर सकते हैं वैश्विक/वर्तमान में नाम स्थान? मैंने कोशिश की

using A::B; 

लेकिन इससे मुझे संकलन त्रुटि मिली।

1) कक्षा बी:

typedef A::B B; 

2) समारोह च():

+4

संकलन त्रुटि थी, "त्रुटि: 'ए' नामस्थान नहीं है"? – Johnsyweb

+4

आप 'ए :: एफ() 'के लिए ऐसा नहीं कर सकते हैं। – iammilind

+1

@iammilind लेकिन आप उस व्यवहार को एक कामकाज के साथ प्राप्त कर सकते हैं। –

उत्तर

16

आप वर्ग के लिए नाम स्थान उपनाम का उपयोग करने में सक्षम होना चाहिए:

using B = A::B; 

आप ऐसा नहीं कर सकते हालांकि कि सदस्य समारोह के साथ, नहीं भी स्थिर सदस्य कार्यों के साथ।

संपादित करें:this SO answer (What is the difference between 'typedef' and 'using' in C++11) के अनुसार इस मान्य होना चाहिए, और वास्तव में एक ही तरीका है कि typedef करता है में एक प्रकार उर्फ ​​पैदा करता है। हालांकि, यह केवल सी ++ 11 है।


सी ++ 11 में स्थिर सदस्य कार्यों के लिए एक समाधान के स्थिर कार्य करने के लिए एक चर की ओर इशारा करते घोषणा के द्वारा, है:

struct Foo 
{ 
    static void bar() 
     { } 
}; 

auto bar = Foo::bar; 

संपादित करें: बेशक, एक वैश्विक चर इशारा कर रहा पुराने सी ++ मानक में एक स्थिर सदस्य फ़ंक्शन के लिए भी संभव है, लेकिन यह C12+ 11 के auto कीवर्ड का उपयोग करने से अधिक गन्दा है। उपर्युक्त उदाहरण में यह होगा:

void (*bar)() = Foo::bar; 
+2

'बी = ए :: बी का उपयोग करके' 'यह काम नहीं करेगा। एक और मुद्दा यह है कि फ़ंक्शन पॉइंटर्स को रेखांकित नहीं किया जा सकता है। –

+4

@ सर्गेईके।जीसीसी 4.7.1 के साथ मेरे लिए ठीक काम करता है। लेकिन आप इनलाइनिंग के बारे में सही हैं। –

+3

1.cpp: 9: 7: त्रुटि: बी = ए :: बी का उपयोग करके 'बी' से पहले अपेक्षित नेस्टेड-नाम-विनिर्देशक; '' (gcc.EXE (जीसीसी) 4.8.0) ' –

8

आप कर सकते हैं typedef

typedef A::B B; 
+5

आप वैश्विक नामस्थान में 'f()' भी बना सकते हैं जो 'ए :: एफ() 'कहता है। –

32

यहाँ अपनी समस्या के लिए दो कामकाज से जुड़े हैं

inline void f() 
{ 
    A::f(); 
} 

लेकिन उनका उपयोग करने से पहले दो बार सोचें।

संपादित करें: सी ++ 11 में आप auto f = A::f; कर सकते हैं, लेकिन यह वास्तव में एक समारोह के लिए एक सूचक बनाता है और कार्यों संकेत inlined नहीं किया जा सकता।

+0

'टाइप किए गए' समाधान के लिए 'समाधान' का उपयोग करने के लिए, निजी नेस्टेड क्लास के साथ भी इसे काम करने का कोई विचार? – Dreamer

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