C ++ 11 Enum forward verursacht "unterliegenden Typ Mismatch"

8

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.

Auch dieses einfache Beispiel funktioniert nicht :

%Vor%     
ytoledano 13.03.2017, 15:01
quelle

2 Antworten

5

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%

%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

    
Vittorio Romeo 13.03.2017, 16:33
quelle
4

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.

    
Nicol Bolas 13.03.2017 16:27
quelle