Ich arbeite in C ++ 11 und habe eine h-Datei in C ++ 03 implementiert. In der h-Datei, die ich einfüge, ist eine enum Foo
definiert. Ich möchte eine Weiterleitung in code.h
angeben und sie in code.cpp
verwenden:
header.h:
%Vor%code.h:
%Vor%code.cpp:
%Vor%Dies ist der Fehler, den ich bekomme, wenn ich kompiliere (getestet g ++ 4.8.5 und g ++ 5.3.1):
%Vor%Ich kann diesen Fehler beheben, wenn ich header.h zu:
ändere %Vor%Aber ich besitze diesen Header nicht und kann ihn nicht ändern. Nimmt man den Fehler bei face value, klingt es so, als ob alles, was ich wissen muss, ist, welchen Typ g ++ für enums verwendet, die keinen zugrunde liegenden Typ angeben, und dann diesen Typ in meinem forward verwenden.
%Vor% Es scheint keine Möglichkeit zu geben, dies zu tun, selbst wenn Sie genau denselben zugrunde liegenden Typ angeben , den der Compiler für Ihre C ++ 03-Art enum
gewählt hätte.
Beispiel: Kompilieren des folgenden Codes ...
%Vor% ... auf Coliru und das Abmelden über c++filt
wird "unsigned int"
mit ausgeben g ++ und clang ++ .
Auch wenn Sie unsigned int
als expliziten zugrunde liegenden Typ Ihrer Foo
Vorwärtsdeklaration angeben , beide Compiler werden sich beschweren .
%Vor%
Dies liegt daran, dass sowohl die Vorwärtsdeklaration als auch die "echte" enum
-Deklaration den gleichen expliziten zugrunde liegenden Typ haben müssen, selbst wenn es Ihnen gelingt, "zu erraten". was der Compiler für dich gewählt hätte.
tl; dr : Sie können eine enum
nur dann weiterleiten, wenn sowohl die Vorwärtsdeklaration als auch die echte Deklaration denselben explizit angegebenen zugrunde liegenden Typ aufweisen
Sie können eine enum nur dann weiterleiten, wenn Sie in der forward-Deklaration einen festen zugrunde liegenden Typ angeben. Außerdem muss die Definition der Enumeration den gleichen fixierten zugrunde liegenden Typ verwenden.
Ihr Problem ist, dass Ihre Enum-Definition in header.h
keinen zugrunde liegenden Typ hat, aber die spätere Vorwärtsdeklaration hat einen. Sie beide müssen einen haben.
Tags und Links c++ gcc c++11 g++ forward-declaration