Frage

  

Mögliche Duplizieren:
   Forward-Deklaration von verschachtelten Typen / Klassen in C ++

Ich habe eine Klasse, wie so ...

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

    ...
};

An anderer Stelle möchte ich einen Container :: Iterator durch Verweis übergeben, aber ich will nicht die Header-Datei aufzunehmen. Wenn ich versuche, um die Klasse zu übermitteln erklären, erhalte ich Fehler kompilieren.

class Container::Iterator;

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

Sie den obigen Code kompilieren gibt ...

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

Wie kann ich uns darauf, diese Klasse deklarieren also muss ich nicht die Header-Datei enthalten, die die Iterator-Klasse deklariert?

War es hilfreich?

Lösung

Das ist einfach nicht möglich. Sie können nach vorn nicht eine verschachtelte Struktur außerhalb des Behälters erklären. Sie können nur erklären uns darauf, innerhalb des Behälters.

Sie müssen eine der folgenden Möglichkeiten tun

  • Stellen Sie die Klasse nicht-verschachtelten
  • Ändern Sie Ihre Erklärung um, so dass die verschachtelte Klasse erste vollständig definiert ist
  • Erstellen Sie eine gemeinsame Basisklasse, die sowohl durch die verschachtelte Klasse in der Funktion und umgesetzt werden kann.

Andere Tipps

Ich glaube nicht, nach vorn auf einer unvollständigen Klasse Arbeiten erklärt innere Klasse (weil ohne die Klassendefinition, gibt es keine Möglichkeit zu wissen, ist, wenn es eigentlich eine innere Klasse). So haben Sie die Definition von Containern, mit einer vorderen erklärte innere Klasse umfassen müssen:

class Container {
public:
    class Iterator;
};

Dann in einem separaten Header, implementieren Container :: Iterator:

class Container::Iterator {
};

Dann # include nur die Container-Header (oder nicht über vorwärts Sorge zu erklären und ist nur beide)

Ich kenne keine Möglichkeit, genau das zu tun, was Sie wollen, aber hier ist eine Abhilfe, wenn Sie bereit sind, Vorlagen zu verwenden:

// 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
}

Wir hoffen, könnte dieses Idiom von einigem Nutzen für Sie (und hoffentlich Ihr Compiler ist EDG-basierte und implementiert Export;)).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top