7
votes

Comment puis-je empêcher une structure sans nom \ Union?

Je construis une classe qui a une union pour ses données matricielles, cependant, je ne peux que le faire compiler lorsque je n'ai pas de nom pour la structure \ Union. Cependant, avec un niveau d'avertissement de niveau supérieur (quatre sur Visual Studio), je vais un avertissement dire

    union
    {
        struct
        {
            F32 _11, _12, _13, _14;
            F32 _21, _22, _23, _24;
            F32 _31, _32, _33, _34;
            F32 _41, _42, _43, _44;
        };
        F32 _m[16];
    };


1 commentaires

Pour le bénéfice des futurs lecteurs, pouvez-vous montrer votre code qui nomme la structure et ne compile pas?


5 Réponses :


8
votes

nommer, il semble mieux. Les syndicats anonymes sont autorisés en C ++, tout simplement pas des structures. XXX PRE>

Vous pouvez utiliser des références / macros pour permettre l'accès sans bar code>. P>

struct mat 
{
  struct foo 
  {
    friend class mat;
    private:
      F32 _11, _12, _13, _14;
      F32 _21, _22, _23, _24;
      F32 _31, _32, _33, _34;
      F32 _41, _42, _43, _44;
  };
  union
  {
    foo bar;
    F32 _m[16];
  };
};


2 commentaires

Cela semble le faire. Bien que cela ne fait pas partie de la question initiale, existe-t-il un moyen de faire de la barre protégée \ Private tout en permettant toujours à être public?


Oh ok, intéressant. Une dernière chose, j'ai examiné à l'aide de références (je voudrais utiliser _11 si possible, sans le préfixe de celui-ci). Comment la référence pourrait-elle être déclarée dans la classe? Quelque chose comme "f32 & _11 = bar._11;" ne peut pas être en public:.



4
votes

Si tout ce que vous voulez faire est de désactiver l'avertissement sans modifier le code réel, vous pouvez utiliser l'avertissement #pragma la directive, comme: xxx

si vous Voulez-vous de nouveau réellement utiliser: xxx

pour une référence d'addition, voir msdn documentation .


1 commentaires

Désolé, j'aurais dû être plus précis et dit sans simplement désactiver l'avertissement



-2
votes

Vous avez cet avertissement non sur la structure intérieure, mais sur l'union elle-même. Essayez ceci: xxx


0 commentaires

1
votes
union
{
    struct // <- not named here
    {
        F32 _11, _12, _13, _14;
        F32 _21, _22, _23, _24;
        F32 _31, _32, _33, _34;
        F32 _41, _42, _43, _44;
    } AsStruct; // <- named here
    F32 AsArray[16];
};
I fixed it without giving the struct class a name, just the instance name.

0 commentaires

0
votes

Le moyen le plus courant que j'ai vu pour résoudre ce problème est de surcharger l'opérateur de réseau pour le type. Il est assez spécifique à l'exemple que vous avez affiché, mais des méthodes similaires peuvent être utilisées dans d'autres situations où une structure sans nom semble être la seule option.

 vector4 col0 = mymat4[0];


0 commentaires