Pourquoi cette fonction ami ne peut pas accéder à un membre privé de la classe?

Le GHistogram erreur suivant s’affiche lorsque j’essaie d’accéder aux bacs membres privés de la classe GHistogram partir de l’ extractHistogram() :

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

Où l’erreur ‘dans ce contexte’ pointe vers l’ extractHistogram() . Est-ce que quelqu’un sait ce qui ne va pas avec la déclaration de fonction de mon ami?

Voici le code:

 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 bins; }; GHistogram * extractHistogram(GImage * image, qint32 numberOfBins); } // End of MyNamespace 

Selon mon GCC, le code ci-dessus ne comstack pas car la déclaration de extractHistogram() apparaît après la définition de la classe dans laquelle il est extractHistogram() . Le compilateur s’étouffe avec la déclaration de l’ friend disant extractHistogram n’est ni une fonction ni un membre de données. Tout fonctionne bien et les bins sont accessibles lorsque je déplace la déclaration avant la définition de la classe (et ajoute un class GHistogram; déclaration class GHistogram; afin que le type de retour soit connu du compilateur). Bien sûr, le code pour extractHistogram() doit être écrit dans l’espace de noms, soit en

 namesapce MyNameSpace { // write the function here } 

ou

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

Essayez juste:

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

Vous déclarez que Gbdi::extractHistogram est un ami de GHistogram , mais vous déclarez une fonction nommée extractHistogram et vous l’attendez à un ami avec GHistogram . extractHistogram doit être un membre de Gbdi .

Je suppose que tu voulais dire:

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

Ce n’est probablement pas la raison mais une suggestion:

Une dernière chose, vous n’avez pas besoin de déclarer une fonction hors d’une classe si c’est l’ami de cette classe et que vous l’avez déjà déclarée dans la classe.

En d’autres termes:

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