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

Avis sur la norme et plantage du compilateur

1 réponse
Avatar
Yann Renard
Bonjour à tous,

j'ai un avis à vous demander quant au code que j'écris. Le code que je
vous joint après, fonctionne très bien sous linux avec GCC Red Hat
4.0.2-8 ainsi qu'avec GCC Ubuntu 4.1.1-13ubuntu5 mais provoque
malheureusement une erreur interne avec Visual Studio 2005 SP1.

-- CODE --

class ABaseClass
{
public:
virtual void aVirtualFunction(void)
{
}
};

template <
class _OwnerClass,
void (_OwnerClass::*_pMemberFunctionPtr)(void)>
class AProxy : public ABaseClass
{
public:
};

class AClass
{
public:

virtual void aMemberFunction(void)
{
}

AProxy<AClass, &AClass::aMemberFunction> aProxy;
};

AClass anObject;

-- /CODE --

Cet exemple est réduit au strict minimum qui fait planter visual. Le
problème vient de l'accumulation de beaucoup de choses : la fonction
virtuelle dans la classe de base ABaseClass, l'instanciation du membre
template dans la classe utilisée en argument de celui ci. Dans mon cas
précis, j'ai même un héritage virtuel entre le template AProxy et sa
classe de base (ceci suffit à planter visual s'il n'y a pas de méthodes
virtuelles dans la classe de base ABaseClass).

J'imagine que visual s'emmelle les pinceaux dans les calculs d'adresses
qui, reconnaissons le, sont peut être un peu compliqué dans ce cas précis :)

Est ce qu'un tel code devrait passer vis à vis de la norme (au quel cas,
je remonte le bug à microsoft) ou est ce que c'est quand même tiré par
les cheveux et j'ai eu du bol que GCC ne me mette même pas un seul warning ?

Merci d'avance pour votre avis,
Bonne journée
Yann Renard

1 réponse

Avatar
James Kanze
On Mar 22, 11:50 am, Yann Renard wrote:

j'ai un avis à vous demander quant au code que j'écris. Le code que je
vous joint après, fonctionne très bien sous linux avec GCC Red Hat
4.0.2-8 ainsi qu'avec GCC Ubuntu 4.1.1-13ubuntu5 mais provoque
malheureusement une erreur interne avec Visual Studio 2005 SP1.

-- CODE --

class ABaseClass
{
public:
virtual void aVirtualFunction(void)
{
}
};

template <
class _OwnerClass,
void (_OwnerClass::*_pMemberFunctionPtr)(void)>
class AProxy : public ABaseClass
{
public:

};

class AClass
{
public:
virtual void aMemberFunction(void)
{
}

AProxy<AClass, &AClass::aMemberFunction> aProxy;
};

AClass anObject;

-- /CODE --

Cet exemple est réduit au strict minimum qui fait planter visual.


Je ne l'ai pas régardé en détail, mais a priori, je ne vois pas
de problème. Deux choses sont en revanche certaines :

-- Si le compilateur plante (indique une erreur interne, donne
un core dump, etc.), c'est une erreur dans le compilateur.
Que ton programme soit correct ou non. Et tous les
fournisseurs de compilateur sont prêts à le traiter comme
une erreur. Alors, s'il y a un plantage du compilateur,
n'hésite pas.

-- Par défault, VC++ ne traite pas les pointeurs à des
fonctions membres de façon conforme. Il lui faut une option
particulière (/vmg, je crois). Je ne sais pas si c'est le
problème ici ; typiquement, tant que toutes les définitions
et déclarations sont dans le même fichier, ça marche. Mais
ça vaudrait peut-être la peine de l'essayer. Et si tu
comptes travailler avec les pointeurs à des fonctions
membre, il vaut de toute façon mieux que tu le sache. (C'est
documenté quelque part, je crois, mais qui lit la doc ?:-))

--
James Kanze (GABI Software) email:
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