una que otra objeto nombre llevan internas estaticas dentro crear clases clase anonimas c++ forward-declaration

c++ - que - ¿Cómo reenvío declarar una clase interna?



crear un objeto de una clase dentro de otra clase (3)

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

Tendrá que hacer uno de los siguientes

  • Hacer la clase no anidada
  • Cambie su orden de declaración para que la clase anidada esté completamente definida primero
  • Cree una clase base común que pueda ser utilizada en la función e implementada por la clase anidada.

Posible duplicado:
Declaración directa de tipos / clases anidados en C ++

Tengo una clase como tal ...

class Container { public: class Iterator { ... }; ... };

En otro lugar, quiero pasar un Container :: Iterator por referencia, pero no quiero incluir el archivo de encabezado. Si intento reenviar declaro la clase, obtengo errores de compilación.

class Container::Iterator; class Foo { void Read(Container::Iterator& it); };

Compilar el código anterior da ...

test.h:3: error: ‘Iterator’ in class ‘Container’ does not name a type test.h:5: error: variable or field ‘Foo’ declared void test.h:5: error: incomplete type ‘Container’ used in nested name specifier test.h:5: error: ‘it’ was not declared in this scope

¿Cómo puedo reenviar declarar esta clase para que no tenga que incluir el archivo de encabezado que declara la clase Iterator?


No conozco ninguna manera 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 }

Afortunadamente, este modismo podría ser de alguna utilidad para usted (y con suerte su compilador está basado en EDG e implementa la exportación;)).


No creo que declarar adelante la clase interna de una clase incompleta funciona (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, #incluye solo el encabezado del contenedor (o no te preocupes por la declaración progresiva y solo incluye ambos)