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:
};
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
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
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) { }
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
On Mar 22, 11:50 am, Yann Renard <yann.ren...@irisa.fr> 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)
{
}
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:james.kanze@gmail.com
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
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) { }
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