Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

variable statique dans une fonction inline d'une classe template

3 réponses
Avatar
Gilles
Bonjour,

Quelqu'un peut-il m'expliquer le warning que j'obtiens dans le code
ci-dessous ?

Merci d'avance,

Gilles.



template <typename A, typename B>
class C
{
public:
class H
{
public:
H()
{
static bool init = true;

// WARNING: sorry: semantics of inline function static data `bool init' are
// wrong (you'll wind up with multiple copies)
// you can work around this by removing the initializer

if (init)
i = 0;
init = false;
}
int i;
};

static H& GetH()
{
static H s_h;
return s_h;
}
};

3 réponses

Avatar
Arnaud Meurgues
Gilles wrote:

Quelqu'un peut-il m'expliquer le warning que j'obtiens dans le code
ci-dessous ?


Je ne suis pas sûr, mais ne veut-il pas dire que la statique ne sera pas
partagée par toutes les instances du template ?
Bon, le message n'est pas clair, mais ce pourrait être ça ?

--
Arnaud

Avatar
kanze
Arnaud Meurgues wrote:
Gilles wrote:

Quelqu'un peut-il m'expliquer le warning que j'obtiens dans
le code ci-dessous ?


Je ne suis pas sûr, mais ne veut-il pas dire que la statique
ne sera pas partagée par toutes les instances du template ?


S'agit-il d'un ancien compilateur ? La norme exige qu'il n'y a
qu'une seule instance de la variable pour chaque instantiation
du template, mais avant la norme, la plupart des compilateurs en
créaient une instance par unité de traduction où la fonction
servait.

Si c'est le cas, la solution évidente, c'est une mise à jour du
compilateur. Faute de quoi, on pourrait toujours essayer un
static membre de la classe.

Bon, le message n'est pas clair, mais ce pourrait être ça ?


C'est possible aussi. Quelque petits essais avec un static int
qu'on incrémente doit suffire pour déterminer le comportement
exacte du compilateur. Mais a priori, il n'y a rien de faux dans
son code, et je ne m'attendrais pas à un avertissement d'un
compilateur moderne.

Il pourrait aussi essayer la même chose sans le template, juste
pour voir. Mais je serais surtout intéressé à savoir la version
du compilateur.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Gilles
| Si c'est le cas, la solution évidente, c'est une mise à jour du
| compilateur. Faute de quoi, on pourrait toujours essayer un
| static membre de la classe.

Je ne peux pas obliger mon client à changer de compilateur, je retiens donc
la deuxième option.

| Mais je serais surtout intéressé à savoir la version
| du compilateur.

ProDG for PlayStation2 (de SN Systems), dernière version.
Pour info, je compile mon code sans aucun problème avec une bonne dizaine de
compilateurs. Le problème semble bien venir de ProDG.

Merci pour les infos.

Gilles.