buenas:
lo primero, SI, una clase puede ser amiga de una funcion, de hecho es una razon por la que usar friend y no unos buenos getter/setters (aunque NO lo recomiendo), puede ser un asunto de optimizacion de performancia.
Que una funcion sea amiga significa que la funcion PUEDE acceder a los miembros y metodos PROTECTED O PRIVATE de la clase. NO que pueda accedera a ellos sin ni siquiera instanciarla!!.
La funcion es independiente de la clase, pero inmaginate esto:
class Prot
{
private:
int Midatoprivado;
};
si hago:
void Asigna(Prot * p)
{
p->Midatoprivado=0;
}
el compilador me dirá que
no puede acceder al elemento privado. Si hago:
class Prot
{
private:
int Midatoprivado;
friend void Asigna(Prot * p);
};
En cambio si declaro la funcion como amiga, el compilador me dejara ACCESO a los miembros y metodos privados/protected.
En tu caso concreto, en la funcion pretendes acceder a una variable que NO EXISTE,
no has instanciado la clase, no hay un objeto del que requerir la variable. Sin haber creado un objeto, no puedes acceder a sus miembros no estaticos.
Si quieres acceder a la variable, declara STATIC y accede con el contexto por delante (tal y como te expliqué en el post anterior), eso si, los estaticos son UNICOS, mirate el patrón de monoestado en wikipedia.
suerte!