Génération des opérations template

Please use this forum to signal bugs.
Merci d'utiliser ce forum pour signaler des bugs.

Génération des opérations template

Postby Teaniel » Sat 22 Dec 2012 07:57

Bonjour,

C'est encore moi :mrgreen:
Un petit détail encore, dans la génération des opérations des classes génériques en C++ :
Celle-ci donne
Code: Select all
template <dType::eType T>
dDonneeQuelquoncque OPuissance<dType::eType T>Effectuer(args...)
//                             !----------|
{ code...}

ce qui est erroné. Devrait être :
Code: Select all
template <dType::eType T>
dDonneeQuelquoncque OPuissance<T>Effectuer(args...)
{ code...}
(dType::eType est un enum class si cela peut avoir une importance).

En deuxième lieu, lorsque je roundtrip un fichier avec une classe générique que je viens de générer, j'obtiens des messages du style :
in /home/marc/Projets_qt/Orientation/Formules/src/AST/Operateurs/OPuissance.cpp line 7 please, help me, use the template specification of OPuissance's declaration, template are already enough complicated !
Sachant que la seule modification que j'y ai effectuée était la correction de l'erreur ci-dessus, c'est un message que j'ai du mal à comprendre. Serait-ce que vous préféreriez que ces fonctions soient déclarées inline?

Voila, je ne suis pas sur de pouvoir lire votre réponse avant, alors je vous souhaite un très joyeux Noël :)

Amicalement,
Marc
Teaniel
 
Posts: 75
Joined: Sun 28 Oct 2012 18:57

Re: Génération des opérations template

Postby Bruno Pagès » Sat 22 Dec 2012 10:45

Bonjour,

Concernant la génération de code, je n'arrive pas à reproduire votre problème, avec :

Image

édition de OPuissance :

Image
Image

code généré (ici Effectuer est inline, mais cela n'a pas d'importance dans le cas présent) :

Image

Vous trouverez le projet sous http://www.bouml.fr/tmpl.tar.gz

Évidemment vous pouvez produire le code erroné en vidant le type C++ du paramètre formel et en mettant son nom à dType::eType T, mais dans ce cas le paramètre formel est mal défini.

Concernant le roundtrip (ou reverse d'ailleurs), ce message n'apparait normalement que lorsque le nom des paramètres formels n'est pas le identique pour la déclaration et la définition, ce qui n'est pas le cas ici. Si je remplace dType::eType par class (c.a.d. que l'on a template<class T> class OPuissance { ... };) alors il n'y a pas de problème. En fait dans le cas du paramètre formel dType::eType T le reverse/roundtrip créé un paramètre sans type et avec le nom dType::eType T, ce qui est erroné.
ImageAuthor of Bouml
Bruno Pagès
 
Posts: 474
Joined: Mon 20 Feb 2012 08:23
Location: France

Re: Génération des opérations template

Postby Teaniel » Sat 22 Dec 2012 17:58

Re :)

Bon, j'ai tout compris. Il suffit donc que je reprenne toutes mes classes pour placer le type au bon endroit. lol et sur le diagramme ça ne m'a pas troublé!

Le bug, d'après moi se situe donc au niveau du reverse. A l'origine, j'ai reversé un projet que j'avais commencé sous QT, et qui compilait bien (j'ai une vingtaines de classes template de ce style). Cela signifie que, en présence d'un type de paramètre formel non class (ou trop complexe), le reverse prend tout le paramètre et le place dans le nom.
Ce qui est étonnant est qu'il accepte un nom avec un espace dedans dans l'analyse c++.
C'est aussi vrai que, dans le header de la classe il n'a pas accès à la définition complète du type dType (juste un forward dans un header inclus).

Je dois afk un moment, j'édite mon message tout a l'heure pour le compléter.
Teaniel
 
Posts: 75
Joined: Sun 28 Oct 2012 18:57

Re: Génération des opérations template

Postby Teaniel » Sat 22 Dec 2012 21:03

Bon, j'ai refait un essai en effectuant un reverse sur une nouvelle classe.
entete
Code: Select all
#ifndef TEST_H
#define TEST_H

#include "Types/dType.h"

template <dType::eType t>
class test
{
public:
    test();

    void uneFonction(test<t> g);
};

#endif // TEST_H
source :
Code: Select all
#include "test.h"

template <dType::eType t>
test<t>::test()
{
}


template <dType::eType t>
void test<t>::uneFonction(test<t> g)
{
    // une action
}
dType.h (petit bout)
Code: Select all
class dType : public dDonnee
{
    public: enum class eType { tInconnu, /*...*/ };
};


Cette fois, je n'ai pas eu de plainte lors du reverse. Cependant, le type du paramètre est bien placé dans le nom dans l'interface.
Pour moi l'anomalie se situe ici. Elle est double dans le sens où le reverse confond un type de paramètre avec son nom, mais surtout qu'il accepte qu'un nom (id) c++ puisse comporter un (des?) espace.
J'ai essayé ensuite en corrigeant (plaçant le type là où il devrait apparaître), et après un cycle génération/roundtrip, il y est resté. Mais les messages sont revenus.
Pour moi, ce n'est pas trop grave, il suffit de penser, à chaque fois qu'on reverse (la première fois) une classe générique dont le type du paramètre n'est pas class, à déplacer ce type dans la case type de la définition des paramètres de généricité. Après ça semble ne plus bouger.

Edit: Une dernière chose : Ne pas oublier également de placer une dépendance vers dType.h est nécessaire (le type doit être défini). Cela ne peut être fait que manuellement puisque ledit type n'est qu'un simple texte au niveau de la déclaration des paramètres dans bouml.

Voila, une fois qu'on sait, c'est toujours moins grave :)

Amicalement,
Marc
Teaniel
 
Posts: 75
Joined: Sun 28 Oct 2012 18:57

Re: Génération des opérations template

Postby Bruno Pagès » Sun 23 Dec 2012 08:22

le reverse et roundtrip seront bien évidemment corrigés dans la prochaine version

le problème n'arrive pas qu'au premier reverse, si vous corrigez le modèle puis que vous faire un roundtrip la mauvaise définition de paramètre reviendra
ImageAuthor of Bouml
Bruno Pagès
 
Posts: 474
Joined: Mon 20 Feb 2012 08:23
Location: France

Re: Génération des opérations template

Postby Bruno Pagès » Tue 1 Jan 2013 16:08

Bouml 6.4.2 est disponible et corrige ce problème
ImageAuthor of Bouml
Bruno Pagès
 
Posts: 474
Joined: Mon 20 Feb 2012 08:23
Location: France


Return to Bug reports / Rapports de bugs

Who is online

Users browsing this forum: No registered users and 4 guests

cron