Forum Programmation.c++ Initialisateurs nommés

Posté par  .
Étiquettes : aucune
-1
8
fév.
2012

Bonjour,
j’essaye d’utiliser les initialisateurs nommés en C++, mais ça ne semble pas fonctionner.
Voici un squelette de code ainsi que les erreurs de compilation de mon gcc-4.4.5
test.h

namespace Name{
   class Classe
     {
      public:
         struct myStruct
           {
            int a;
            struct
              {
               int b;
               int a;
              } sousStruct;
           };
      private:
         Classe();
         ~Classe();
         static Classe instance;
         static const myStruct defaultValue;
         myStruct value;
      public:
         static Classe * getInstance();
     };
};

test.cpp (Attention, le « #else » n’est pas pris en compte par l’analyseur syntaxique)

#include "test.h"

#if 0
const Name::Classe::myStruct defaultValue = { 3, {5, 3}};

#else

const Name::Classe::myStruct defaultValue = {
   .a = 3,
   .sousStruct = {
      .b = 5,
      .a = 3,
   },
};
#endif

Name::Classe::Classe()
  {
   value = defaultValue;
  }

Name::Classe::~Classe()
  {
  }

Name::Classe *Name::Classe::getInstance()
  {
   return &instance;
  }


Lorsque je compile avec #if 1, aucun soucis, c’est l’ancienne forme d’initialisation des structure. Mais si je bascule sur #if 0 j’obtiens :

$ g++ -c test.cpp 
test.cpp:9: erreur: expected primary-expression before '.' token
test.cpp:10: erreur: expected primary-expression before '.' token
test.cpp:11: erreur: expected primary-expression before '.' token
test.cpp:12: erreur: expected primary-expression before '.' token
test.cpp:13: attention : extended initializer lists only available with -std=c++0x or -std=gnu++0x
capello@lestat[RW] ~/tmp
$ g++ -c test.cpp -std=c++0x
test.cpp:9: erreur: expected primary-expression before '.' token
test.cpp:10: erreur: expected primary-expression before '.' token
test.cpp:11: erreur: expected primary-expression before '.' token
test.cpp:12: erreur: expected primary-expression before '.' token
capello@lestat[RW] ~/tmp
$ 

  • # C99

    Posté par  . Évalué à 2. Dernière modification le 08 février 2012 à 14:54.

    C'est une fonctionnalité de C99, qui n'existe tout simplement pas en C++.

    À noter que gcc/g++ a une extension un peu obsolète où l'on peut écrire "a:" au lieu de ".a=" dans votre code.

    • [^] # Re: C99

      Posté par  . Évalué à 2.

      Grrrr, comme le C++0x date d’après 99, je pensais que ça avait été intégré. Sais-tu où je pourrais télécharger un draft de la norme ?
      Cela a-t’il été intégré dans la version 2011 de la norme ?

      Merci.

      • [^] # Re: C99

        Posté par  . Évalué à 4.

        Le document de travail récent peut être téléchargé là : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf. Le standard n'est par contre pas téléchargeable sans payer.
        Je ne sais pas si ces initialiseurs ont été intégrés.

        • [^] # Re: C99

          Posté par  . Évalué à 2.

          Merci pour le lien. Il faudra que je l’achète un jour, je traine le C99(dernier draft) depuis quelques années.
          Chapitre 8.5.1 pour les initialisations de structures, mais rien sur les nommages…

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.