C++11 Enum forward veroorzaakt een mismatch van het onderliggende type

C++11 Enum forward veroorzaakt een mismatch van het onderliggende type

Er lijkt geen enkele manier te zijn om dit te doen, zelfs als u exact hetzelfde onderliggende type opgeeft die de compiler zou hebben gekozen voor uw C++03-stijl enum .

Voorbeeld:de volgende code compileren...

enum Foo { A=1 };
cout << typeid(typename std::underlying_type<Foo>::type).name();

...op Coliru en ontmantelen via c++filt zal "unsigned int" . afdrukken beide met g++ en clang++ .

Zelfs als u unsigned int . opgeeft als het expliciete onderliggende type van je Foo aangifte naar voren , zullen beide compilers klagen.

enum Foo : unsigned int;
void bar(Foo);

enum Foo {A=1};

main.cpp:8:6: error: enumeration previously declared with fixed underlying type
enum Foo {A=1};
     ^
main.cpp:5:6: note: previous declaration is here
enum Foo : unsigned int;
     ^

Dit komt omdat zowel de vooruitmelding en de "echte" enum declaratie moet dezelfde expliciete . hebben onderliggende type, zelfs als u erin slaagt te "raden" wat de compiler voor u zou hebben gekozen.

tl;dr :u kunt alleen een enum forward doorsturen als zowel de forward-declaratie als de echte declaratie dezelfde expliciet gespecificeerd hebben onderliggend type.


U kunt een enumeratie alleen doorsturen als u deze een vast onderliggend type geeft in de voorwaartse aangifte. Ook moet de definitie van de enum de dezelfde . gebruiken vast onderliggend type.

Uw probleem is dat uw enum-definitie in header.h heeft geen onderliggend type, maar de latere voorwaartse declaratie heeft er wel een. Ze beiden moet er een hebben.