S'il vous plaît voir le code exemple ci-dessous:La fonction membre de la classe imbriquée ne peut pas accéder à la fonction de la classe englobante. Pourquoi?
class A
{
private:
class B
{
public:
foobar();
};
public:
foo();
bar();
};
Dans la classe A & B mise en œuvre:
A::foo()
{
//do something
}
A::bar()
{
//some code
foo();
//more code
}
A::B::foobar()
{
//some code
foo(); //<<compiler doesn't like this
}
Les drapeaux du compilateur l'appel à foo() dans la méthode foobar(). Auparavant, j'avais foo() en tant que fonction de membre privé de classe A mais changé en public en supposant que la fonction de B ne peut pas le voir. Bien sûr, cela n'a pas aidé. J'essaye de réutiliser la fonctionnalité fournie par la méthode de A. Pourquoi le compilateur n'autorise-t-il pas cet appel de fonction? Comme je le vois, ils font partie de la même classe englobante (A). Je pensais que le problème d'accessibilité des classes imbriquées pour l'inclusion de classe dans les normes C++ était résolu.
Comment puis-je réaliser ce que j'essaie de faire sans réécrire la même méthode (foo()) pour B, ce qui maintient B imbriqué dans A? J'utilise VC++ compiler ver-9 (Visual Studio 2008). Merci de votre aide.
+1, juste un nitpick - 'parent' n'est probablement pas le meilleur nom pour la variable membre ici - confusion facile avec l'héritage. –
Je voulais juste mentionner qu'il y avait une très bonne raison pour que la classe B imbriquée ait une référence à la classe A. – manifest
Merci pour l'explication avec l'exemple. Le standard C++ 11.8, que je devinais qu'il avait changé, parle de l'accès des membres de la classe par classe imbriquée. Je sais que gcc permet l'accès par classe imbriquée (j'en suis sûr) mais le compilateur MS VC ne le fait pas. Hum ... intéressant. – Rahul