variable statique dans une fonction inline d'une classe template
3 réponses
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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 ?
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
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
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
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
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.
| 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.
| 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.