2010-03-23 4 views
5

Je reçois l'erreur suivante lorsque je tente d'accéder à des bacs parlementaire de la classe GHistogram à partir de la mise en œuvre extractHistogram():Pourquoi cette fonction ami n'a pas accès à un membre privé de la classe?

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

Lorsque l'erreur « dans ce contexte » des points à la mise en œuvre extractHistogram(). Est-ce que quelqu'un sait ce qui ne va pas avec ma déclaration de fonction 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<double> bins; 
}; 

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

} // End of MyNamespace 
+2

est 'Gbdi' une classe ou d'espace de noms? Vous avez 'Gbdi :: extractHistogram' comme ami. – quamrana

+0

Désolé, remplacez Gbdi par MyNamespace. GBDI est le nom du groupe de recherche où je travaille ... –

Répondre

5

Selon mon GCC le code ci-dessus ne compile pas parce que la déclaration de extractHistogram() apparaît après la définition de la classe dans laquelle il est friend ed. Le compilateur s'interrompt sur l'instruction friend, indiquant que extractHistogram n'est ni une fonction ni un membre de données. Tout fonctionne bien et bins est accessible lorsque je déplace la déclaration à avant la définition de classe (et ajouter une déclaration avant class GHistogram; de sorte que le type de retour est connu du compilateur). Bien sûr, le code pour extractHistogram() doit être écrit dans l'espace de noms, soit par

namesapce MyNameSpace { 
// write the function here 
} 

ou

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

Merci! J'avais essayé de déclarer extractHistogram() avant la déclaration de classe, mais cela ne fonctionnait pas car il manquait la portée de l'espace de noms dans l'implémentation de la fonction - je pensais que je devais juste utiliser la clause 'using namespace' ... –

1

Vous déclarez Gbdi::extractHistogram être un ami à GHistogram, mais vous déclarez une fonction nommé extractHistogram et attendre à un ami avec GHistogram. extractHistogram doit être membre de Gbdi.

+0

Désolé pour mon erreur. Le bon est MyNamespace au lieu de Gbdi dans le code. –

2

juste essayer:

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

Désolé pour mon erreur. Le bon est MyNamespace au lieu de Gbdi int le code. Lorsque je supprime le MyNamespace, j'obtiens la même erreur. –

1

Je suppose que vous vouliez dire:

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

C'est probablement pas la raison, mais une suggestion:

une chose, vous ne 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é dans la classe.

En d'autres termes:

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

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

Mais si je fais cela, quand j'essaye d'invoquer m(), disons int main() dans 'main.cpp' j'obtiendrai une erreur qui me dit que 'm() n'a pas été déclaré dans cette portée' même si J'inclus le 'Your.h' dans mon 'main.cpp'. –

+0

Vous avez totalement raison. Ça m'a échappé parce que normalement je ne fais pas ça. Je vais supprimer cela. Pardon. – Anzurio

Questions connexes