¿Cómo reenvío declarar una clase interna?

¿Cómo reenvío declarar una clase interna?

Esto simplemente no es posible. No puede reenviar declarar una estructura anidada fuera del contenedor. Solo puede reenviar declararlo dentro del contenedor.

Deberá realizar una de las siguientes

  • Hacer que la clase no esté anidada
  • Cambie el orden de su declaración para que la clase anidada esté completamente definida primero
  • Cree una clase base común que pueda usarse en la función e implementarse mediante la clase anidada.

No creo que la declaración de la clase interna de una clase incompleta funcione (porque sin la definición de la clase, no hay forma de saber si realmente hay una clase interna). Por lo tanto, deberá incluir la definición de Contenedor, con una clase interna declarada hacia adelante:

class Container {
public:
    class Iterator;
};

Luego, en un encabezado separado, implemente Container::Iterator:

class Container::Iterator {
};

Luego, #incluya solo el encabezado del contenedor (o no se preocupe por la declaración de reenvío e incluya ambos)


No conozco ninguna forma de hacer exactamente lo que quiere, pero aquí hay una solución, si está dispuesto a usar plantillas:

// Foo.h  
struct Foo
{
   export template<class T> void Read(T it);
};
// Foo.cpp
#include "Foo.h"
#include "Container.h"
/*
struct Container
{
    struct Inner { };
};
*/
export template<> 
  void Foo::Read<Container::Inner>(Container::Inner& it)
{

}
#include "Foo.h"
int main()
{
  Foo f;
  Container::Inner i;
  f.Read(i);  // ok
  f.Read(3);  // error
}

Con suerte, esta expresión podría serte útil (y con suerte tu compilador está basado en EDG e implementa la exportación;) ).