Por favor, ver el código de ejemplo a continuación:La función de miembro de clase anidada no puede acceder a la función de clase adjunta. ¿Por qué?
class A
{
private:
class B
{
public:
foobar();
};
public:
foo();
bar();
};
Dentro de la clase A & aplicación B:
A::foo()
{
//do something
}
A::bar()
{
//some code
foo();
//more code
}
A::B::foobar()
{
//some code
foo(); //<<compiler doesn't like this
}
Las opciones del compilador la llamada a foo() en el método de foobar(). Anteriormente, tenía foo() como función de miembro privado de la clase A, pero cambió a público suponiendo que la función de B no puede verlo. Por supuesto, no ayudó. Estoy tratando de volver a utilizar la funcionalidad proporcionada por el método de A. ¿Por qué el compilador no permite esta llamada de función? Como lo veo, son parte de la misma clase adjunta (A). Pensé que se había resuelto el problema de accesibilidad para los miembros de clase anidados para encerrar clase en estándares de C++.
¿Cómo puedo lograr lo que estoy tratando de hacer sin volver a escribir el mismo método (foo()) para B, que mantiene B anidado dentro de A?
Estoy usando el compilador VC++ ver-9 (Visual Studio 2008). Gracias por tu ayuda.
+1, solo un nitpick - 'parent' probablemente no sea el mejor nombre para la variable miembro aquí - confusión fácil con la herencia. –
Solo quería mencionar que había una muy buena razón de diseño para que la clase anidada B tuviera una referencia a la clase A. – manifest
Gracias por la explicación con el ejemplo. El estándar C++ 11.8, que estaba adivinando que había cambiado, habla sobre el acceso de miembro de clase por clase anidada. Sé que gcc permite el acceso por clase anidada (estoy seguro) pero el compilador de MS VC no. Mmm interesante. – Rahul