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() { }