2012-06-07 26 views
9

इम अंदर इस तरह नाम स्थान बाहर की कक्षा दोस्त समारोह को परिभाषित करने की कोशिश कर रहा:वर्ग दोस्त समारोह एक namespace

namespace A{ 
class window{ 
    private: 
    int a; 
    friend void f(window); 
}; 
} 

void f(A::window rhs){ 
cout << rhs.a << endl; 
} 

इम एक त्रुटि हो रही है कहा अस्पष्टता नहीं है। और दो उम्मीदवार void A::f(A::window); और void f(A::window) हैं। तो मेरा सवाल है:

1) वैश्विक कार्य void f(A::window rhs) कक्षा ए :: विंडो के मित्र को कैसे बनाएं।

संपादित करें: (उत्तर पढ़ने के बाद)

2) कारण है कि मैं ::f(window) करके वैश्विक होने के लिए विंडो वर्ग के अंदर च सदस्य समारोह में अर्हता प्राप्त करने की आवश्यकता है?

3) मुझे इस विशेष मामले में फ़ंक्शन f (ए :: विंडो) की पूर्ववत करने की आवश्यकता क्यों है, जबकि जब कक्षा को नामस्थान के अंदर परिभाषित नहीं किया जाता है तो फ़ंक्शन घोषित होने के बाद फ़ंक्शन घोषित किया जाता है एक दोस्त।

उत्तर

15

साथ ही एक :: आप की जरूरत जोड़ने अग्रेषित करने के लिए यह घोषणा, उदा .:

namespace A { class window; } 

void f(A::window); 

namespace A{ 
    class window{ 
    private: 
    int a; 
    friend void ::f(window); 
    }; 
} 

void f(A::window rhs){ 
    std::cout << rhs.a << std::endl; 
} 

ध्यान दें कि यह आगे घोषणा के लिए आप भी वर्ग की घोषणा अग्रेषित करने के लिए की जरूरत है काम करने के लिए के रूप में!

+0

इसलिए :: ग्लोबल नेम स्पेस का उपयोग करने के उपसर्ग एक है कि आवश्यक है पूर्व घोषित समारोह शून्य एफ (ए :: खिड़की); क्या ये सही है। अग्रिम में धन्यवाद। – AlexDan

+0

हां यह काम करता है जब फ़ंक्शन शून्य हो जाता है। लेकिन क्या होगा अगर यह कक्षा का एक उदाहरण देता है, बी कहते हैं? फिर "दोस्त बी :: एफ()" पर कंपाइलर बारफ्स क्योंकि ऐसा लगता है कि हमारा मतलब है "बी :: एफ()" (यानी क्लास बी का एक फ़ंक्शन, वैश्विक फ़ंक्शन के विपरीत)। उस के लिए कोई समाधान? –

+0

मुझे नहीं लगता कि आप कानूनी रूप से नाम के साथ कैसे समाप्त कर सकते हैं - क्या आप इसे विचारधारा की तरह कुछ दिखा सकते हैं? – Flexo

4

यह करना चाहिए: आप आगे की जरूरत है यह स्पष्ट च बनाने के लिए वाणी ग्लोबल नेम स्पेस में है (और स्थिर फाइल नहीं):

#include <string> 
#include <iostream> 

using namespace std; 

////// forward declare magic: 

namespace A{ class window; }  
void f(A::window rhs); 

////// 

namespace A { 
    class window { 
     private: 
      int a; 
      friend void ::f(window); 
    }; 
} 

void f(A::window rhs) { 
    cout << rhs.a << endl; 
} 

int main() 
{ 
} 
संबंधित मुद्दे