2017-08-03 2 views
-1

J'ai le code qui contient la ligne'struct ENUM' ne compilera pas moins <iostream> est inclus

enum struct cols: int8_t {red, blue, green}; 

Quand je compile, je reçois des erreurs:

test.cpp:4:1: warning: elaborated-type-specifier for a scoped enum must not use the 'struct' keyword 
enum struct cols: int8_t {red, blue, green}; 
^ 
test.cpp:4:13: error: use of enum 'cols' without previous declaration 
enum struct cols: int8_t {red, blue, green}; 
      ^
test.cpp:4:17: error: expected unqualified-id before ':' token 
enum struct cols: int8_t {red, blue, green}; 
       ^

Cependant, si je mets la ligne

#include <iostream> 

en haut, il compile sans se plaindre.

Y at-il une explication à cela?

(J'utilise g ++ 4.9.4, mais ce comportement est également affiché avec g ++ 5.4.0.)

Répondre

1

std::int8_t n'est pas un type intégré. Il s'agit, comme tous les autres types de largeur exacte, d'un typedef facultatif à un type intégré, présent uniquement si votre système a un type approprié de cette largeur. Ce type et les autres types std::[u]int*_t disponibles sont définis au <cstdint>. Par conséquent, vous devez #include <cstdint>. Comme mon paragraphe ci-dessus l'indique, vous devez également spécifier le qualificatif d'espace de noms std::, car les symboles stdlib des en-têtes <c*> ne doivent pas être disponibles dans l'espace de noms global.

Vraisemblablement, <iostream> comprenait auparavant indirectement <cstdint> par une certaine route, mais vous ne devriez pas compter sur cela; vous devriez #include l'en-tête correct pour chaque symbole de bibliothèque que vous utilisez.

Ensuite, la chose à propos struct est un hareng rouge découlant de l'autre, le principal problème du type sous-jacent inconnu; voir Elaborated-type-specifier for a scoped enum must not use the ‘class’ keyword, que maintenant que je regarde, est presque un doublon exact de votre question.