2010-07-12 52 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

我相信compilernayan打算是聲明樂趣()的拿煙命名空間之外。 – 2010-07-12 17:17:13

+1

@Vitor Py:Ya我知道,但它並沒有傷害顯示差異明確。每個朋友都提到不同的東西。 – 2010-07-12 17:18:04

4

fun()函數位於全局命名空間中。你需要一個原型:

void fun(); 

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

} 

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