2010-07-12 17 views
7

मेरे पास एक नामस्थान के अंदर एक कक्षा है और उस वर्ग में एक निजी फ़ंक्शन है। और एक वैश्विक कार्य है। मैं चाहता हूं कि वैश्विक कार्य मेरी कक्षा का मित्र हो जो नामस्थान के अंदर है। लेकिन जब मैं इसे एक दोस्त के रूप में बना देता हूं, तो संकलक सोचता है कि फ़ंक्शन वैश्विक नहीं है और यह उस नामस्थान के अंदर ही है। इसलिए यदि मैं वैश्विक फ़ंक्शन के साथ निजी सदस्य फ़ंक्शन तक पहुंचने का प्रयास करता हूं, तो यह काम नहीं करता है, जबकि यदि मैं उस नामस्थान में उसी नाम के साथ एक फ़ंक्शन को परिभाषित करता हूं तो यह काम करता है। नीचे वह कोड है जिसे आप देख सकते हैं।यदि क्लास नामस्थान के अंतर्गत है तो मित्र फ़ंक्शन निजी फ़ंक्शन तक नहीं पहुंच सकता

#include <iostream> 
#include <conio.h> 

namespace Nayan 
{ 
    class CA 
    { 
    private: 
     static void funCA(); 
     friend void fun(); 
    }; 

    void CA::funCA() 
    { 
     std::cout<<"CA::funCA"<<std::endl; 
    } 

    void fun() 
    { 
     Nayan::CA::funCA(); 
    } 

} 

void fun() 
{ 
    //Nayan::CA::funCA(); //Can't access private member 
} 


int main() 
{ 
    Nayan::fun(); 
    _getch(); 
    return 0; 
} 

मैं भी दोस्त शून्य :: मज़ा के रूप में दोस्त बनाने के लिए करने की कोशिश की(); और यह भी मदद नहीं करता है।

उत्तर

17

आपको वैश्विक स्कोप ऑपरेटर :: का उपयोग करने की आवश्यकता है।

void fun(); 

namespace Nayan 
{ 
    class CA 
    { 
    private: 
     static void funCA(); 
     friend void fun(); 
     friend void ::fun(); 
    }; 

    void CA::funCA() 
    { 
     std::cout<<"CA::funCA"<<std::endl; 
    } 

    void fun() 
    { 
     Nayan::CA::funCA(); 
    } 

} 


void fun() 
{ 
    Nayan::CA::funCA(); //Can access private member 
} 
+0

मेरा मानना ​​है कि क्या कंपाइलर्नियन इरादा नामस्थान के बाहर मजेदार घोषित करना है()। –

+1

@ विटर पी: हां मुझे पता है लेकिन यह स्पष्ट रूप से अंतर दिखाने के लिए चोट नहीं पहुंचाता है। प्रत्येक दोस्त कुछ अलग संदर्भित करता है। –

4

मजेदार() फ़ंक्शन वैश्विक नामस्थान में है। आपको प्रोटोटाइप की आवश्यकता है:

void fun(); 

namespace Nayan 
{ 
    class CA 
    { 
    private: 
     static void funCA() {} 
     friend void ::fun(); 
    }; 

} 

void fun() 
{ 
    Nayan::CA::funCA(); 
} 
संबंधित मुद्दे

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