2012-12-16 39 views
6

अनुसार 7.3.1.2 करने के लिए नाम स्थान सदस्य परिभाषाओं 14882: 2003 (ई)सी ++ फॉरवर्ड घोषणा और नाम स्थान में मैत्री सी ++ मानक आईएसओ/आईईसी में

हर नाम पहली बार एक नाम स्थान में घोषणा की कि नाम स्थान का एक सदस्य है । यदि किसी गैर-स्थानीय वर्ग में किसी मित्र की घोषणा पहले को कक्षा या फ़ंक्शन घोषित करती है (इसका अर्थ यह है कि कक्षा का नाम या फ़ंक्शन अयोग्य है) मित्र वर्ग या फ़ंक्शन का सबसे निचला नामांकन नामस्थान का सदस्य है।

// Assume f and g have not yet been defined. 
void h(int); 
template <class T> void f2(T); 
namespace A { 
    class X { 
    friend void f(X); // A::f(X) is a friend 
     class Y { 
     friend void g(); // A::g is a friend 
     friend void h(int); // A::h is a friend 
     // ::h not considered 
     friend void f2<>(int); // ::f2<>(int) is a friend 
     }; 
    }; 
    // A::f, A::g and A::h are not visible here 
    X x; 
    void g() { f(x); } // definition of A::g 
    void f(X) { /* ... */} // definition of A::f 
    void h(int) { /* ... */ } // definition of A::h 
    // A::f, A::g and A::h are visible here and known to be friends 
} 

void h(int); के बाद से पहली बार विश्व नाम स्थान में घोषित किया जाता है, यह वैश्विक नामस्थान का एक सदस्य है। class Y में A::h पर ::h पर मित्र घोषणा friend void h(int); क्यों है?

+0

आप कक्षा X पर एक शून्य मित्र घोषित कर रहे हैं। अगर ऐसा कुछ और हुआ तो मैं चिंतित होगा। शून्य एच (int) वैश्विक में पहले घोषित किया गया है लेकिन वाई स्पष्ट रूप से नामस्थान ए में है। – Jay

उत्तर

2

पैरा के अंत में यह कहा गया है:

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

यही कारण है कि ::h नहीं माना जाता है है: यह न तो एक योग्य नाम है और न ही एक टेम्पलेट आईडी है। यही कारण है कि ':: f2` माना जाता है, क्योंकि यह एक टेम्पलेट-आईडी है।

1

मुझे लगता है कि आंतरिक घोषणाएं वैश्विक नामस्थान में लोगों को छाया देती हैं। साथ ही, मित्र घोषणाएं स्वयं आगे की घोषणाएं हैं, इसलिए वे वैश्विक नामस्थान में लोगों को छायांकित करते हैं, न केवल उन कार्यों को "संदर्भित" करते हैं।

को 3.3.10.1 "नाम छुपा" N3485 में चर्चा करते हुए:

एक नाम एक नेस्टेड कथात्मक क्षेत्र में है कि एक ही नाम के एक स्पष्ट घोषणा या व्युत्पन्न वर्ग (10.2) से छिपा हो सकता है।

11.3.4 मित्र:

एक समारोह में पहली बार एक दोस्त घोषणा घोषित बाहरी लिंकेज (3.5) है। अन्यथा, फ़ंक्शन अपने पिछले लिंक (7.1.1) को बरकरार रखता है।

3.5.2 को देखते हुए:

एक नाम बाह्य संबंध होता है तो इकाई यह दर्शाता है हो सकता है अन्य अनुवाद इकाइयों की या एक ही की अन्य कार्यक्षेत्रों से कार्यक्षेत्रों से नामों से जाना जाता अनुवाद इकाई