2010-07-12 12 views
7

Tengo una clase dentro de un espacio de nombres y esa clase contiene una función privada. Y hay una función global. Quiero que esa función global sea el amigo de mi clase que está dentro del espacio de nombres. Pero cuando lo hago como amigo, el compilador piensa que la función no es global y está dentro de ese espacio de nombres. Entonces, si intento acceder a la función de miembro privado con función global, no funciona, mientras que si defino una función con el mismo nombre en ese espacio de nombres, funciona. A continuación está el código que puedes ver.La función de amigo no puede acceder a la función privada si la clase está bajo un espacio de nombres

#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; 
} 

también traté de hacer amigo como amigo vacío :: divertido(); Y tampoco ayuda.

Respuesta

17

Debe utilizar el operador de alcance global ::.

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

Creo que lo que compilarnayan pretende es declarar fun() fuera del espacio de nombres Nayan. –

+1

@Vitor Py: Ya lo sé, pero no está de más mostrar la diferencia explícitamente. Cada amigo se refiere a algo diferente. –

4

La función fun() está en el espacio de nombres global. Necesita un prototipo:

void fun(); 

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

} 

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