C++/CLI: Public ref struct erzeugt C2011: 'class' - Typ-Neudefinition
Ich habe eine header-Datei in eine verwaltete DLL-Projekt so:
Enums.h:
#pragma once
...
public ref struct ManagedStruct {
Bitmap^ image;
}
...
Dieser header wird verwiesen beide aus einer anderen Klasse in der DLL, und aus einer separate ausführbare Datei. Das verwaltete Struktur allein generieren:
error C2011: 'ManagedStruct' : 'class' - Typ-Neudefinition.
Wenn ich den struct, um die Haupt-header-Datei der DLL funktioniert es einwandfrei, und ist öffentlich zugänglich, so dass ist, was ich Tue, aber ich würde sehr gerne erfahren, warum dies passiert ist, wenn ich nur eine Bewegung in eine andere Datei.
Habe ich geprüft, alle notwendigen includes und namespaces UND versucht die offensichtliche header Wachen, ohne Erfolg; ich bekomme immer noch den Fehler.
Vielen Dank für jede Einsicht!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie de-tune die traditionelle C/C++ - header-Datei ein bisschen denken beim arbeiten mit verwaltetem code. Die wesentliche Ursache des Typ-Deklarationen ist den Metadaten der assembly. Dies ist sehr Verschieden von dem nativen C/C++ compilation model, wo Sie haben, um eine header-Datei für die Typen, die Sie machen Sie sichtbar für andere Module.
Ich werde zu erraten, dass Sie Holen Sie sich dieses C2011 Fehler in der EXE-Projekt. Wo Sie auch Hinzugefügt einen Verweis auf das DLL-Projekt-Montage (wie Sie sollten) und verwendet #include auf die header-Datei. Wie sollten Sie nicht. Das ist eine garantierte doppelte definition #pragma once nicht beheben.
Nicht verwenden header-Dateien für den Export von Typ-Definitionen. Verwenden Sie immer die assembly verweist.
Ich Weiß, diese Frage ist ein bisschen alt, aber ich Schreibe dies für die zukünftige Verwendung:
Ich hatte Folgendes problem, das ähnlich war:
managed DLL hatte eine verwaltete Klasse.
verwaltete.h:
in einem unamanged Klasse wollte ich mit dem obigen Klasse und so in nicht verwalteten.h
anderen DLL hab ich auch:
welches gelöst in der Art Neudefinition Fehler.
Ich habe eine Lösung gefunden, um dieses Problem mithilfe der folgenden Methode:
forward-Deklaration der nicht verwalteten.h
und umfassen die verwalteten.h in der unmanaged.cpp die Datei wie gewohnt.