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 BFG . É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 Anthony Jaguenaud . É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 BFG . É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 Anthony Jaguenaud . É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.