Por favor, considere el código:C++ extern mundial amigo "C" no puede alcanzar miembro privado de la clase de espacio de nombres
#include <iostream>
using namespace std;
extern "C"
void foo(void);
namespace A
{
template< int No >
class Bar
{
private:
friend void ::foo(void);
static void private_func(int n);
};
template< int No >
void Bar<No>::private_func(int n)
{
cout << "A:Bar< " << No << ">::private_func(" << n << ")" << endl;
}
}
extern "C"
void foo(void)
{
A::Bar<0>::private_func(1);
}
int main()
{
cout << " ---- " << endl;
foo();
}
G ++ da:
> g++ -Wall -o extern_c extern_c.cpp
extern_c.cpp: In function ‘void foo()’:
extern_c.cpp:20:7: error: ‘static void A::Bar<No>::private_func(int) [with int No = 0]’ is private
extern_c.cpp:29:31: error: within this context
Si comento el namspace A
, se compilará y corre correctamente
¿Qué me estoy perdiendo?
Busqué temas relacionados, pero no encontré ninguno que se ajuste a mi problema.
- C++: namespace conflict between extern "C" and class member
- Why this friend function can't access a private member of the class?
Gracias gente.
EDIT:
ahora estoy convencido de que extern "C"
no tiene nada que ver con el problema. Por favor ignórelo.
No será fácil poner mi 'foo()' real en un espacio de nombres porque es una rutina de servicio de interrupción, pero lo intentaré de todos modos. Gracias. – j4x
Creo que este tipo tiene el mismo problema, pero ninguno ha sido respondido: http://stackoverflow.com/questions/2236712/how-do-i-define-a-friend-class-from-the-global-namespace- in-another-namespace –
Parece ser el mismo problema, pero la sugerencia de espacio de nombres vacía no funciona. Veo el mismo error. – j4x