2010-03-23 30 views
5

estoy recibiendo el siguiente error al intentar acceder a los contenedores miembro privado de la clase GHistogram desde dentro de la aplicación extractHistogram():¿Por qué esta función amiga no puede acceder a un miembro privado de la clase?

error: 'QVector<double> MyNamespace::GHistogram::bins' is private 
error: within this context 

donde los puntos de la 'dentro de este contexto' error a la aplicación extractHistogram(). ¿Alguien sabe qué pasa con la declaración de mi función amiga?

Aquí está el código:

namespace MyNamespace{ 

class GHistogram 
{ 

public: 
    GHistogram(qint32 numberOfBins); 
    qint32 getNumberOfBins(); 

    /** 
    * Returns the frequency of the value i. 
    */ 
    double getValueAt(qint32 i); 
    friend GHistogram * MyNamespace::extractHistogram(GImage *image, 
                 qint32 numberOfBins); 

private: 
    QVector<double> bins; 
}; 

GHistogram * extractHistogram(GImage * image, 
           qint32 numberOfBins); 

} // End of MyNamespace 
+2

es 'Gbdi' una clase o espacio de nombres? Tienes 'Gbdi :: extractHistogram' como amigo. – quamrana

+0

Lo sentimos, reemplace Gbdi por MyNamespace. GBDI es el nombre del grupo de investigación donde trabajo ... –

Respuesta

5

Según mi GCC el código anterior no se compila porque la declaración de extractHistogram() aparece después de la definición de clase en el que es friend ed. El compilador se ahoga en la declaración friend, diciendo que extractHistogram no es una función ni un miembro de datos. Todo funciona bien y se puede acceder al bins cuando muevo la declaración a antes de la definición de la clase (y añada una declaración directa class GHistogram; para que el compilador conozca el tipo de devolución). Por supuesto, el código para extractHistogram() debe ser escrito en el interior del espacio de nombres, ya sea por

namesapce MyNameSpace { 
// write the function here 
} 

o

GHistogram *MyNameSpace::extractHistogram(//.... 
+0

¡Gracias! Intenté declarar extractHistogram() antes de la declaración de clase, pero no funcionó porque faltaba el ámbito del espacio de nombres en la implementación de la función. Pensé que solo tenía que usar la cláusula 'using namespace' ... –

1

se declara Gbdi::extractHistogram ser un amigo a GHistogram, pero se declara una función llamada extractHistogram y esperar a un amigo con GHistogram. extractHistogram debe ser miembro de Gbdi.

+0

Disculpa por mi error. El correcto es MyNamespace en lugar de Gbdi en el código. –

2

intente Es:

friend GHistogram *extractHistogram(GImage *image, qint32 numberOfBins); 
+0

Disculpa por mi error. El correcto es MyNamespace en lugar del código Gbdi int he. Cuando elimino MyNamespace obtengo el mismo error. –

1

supongo que quería decir:

friend GHistogram * extractHistogram(GImage *image, qint32 numberOfBins); 

Esta es, probablemente, no es la razón sino una sugerencia:

Una cosa más, no lo hace necesita declarar una función fuera de una clase si es el amigo de esa clase y usted ya la declaró dentro de la clase.

En otras palabras:

//Your.h 
class Foo 
{ 
friend void m(); 
} 
void m(); //This is totally unnecessary 

//Your.cpp 
void m() 
{ 
} 
+0

Pero si hago eso, cuando intento invocar m() desde, digamos int main() en 'main.cpp', obtendré un error que me dice que 'm() no se declaró en este ámbito', incluso si Incluyo el 'Your.h' en mi 'main.cpp'. –

+0

Tienes toda la razón. Me olvidé porque normalmente no hago eso. Eliminaré eso. Lo siento. – Anzurio

Cuestiones relacionadas