Page 1 of 1

Génération des opérations template

PostPosted: Sat 22 Dec 2012 07:57
by Teaniel
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

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

PostPosted: Sat 22 Dec 2012 10:45
by Bruno Pagès
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é.

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

PostPosted: Sat 22 Dec 2012 17:58
by Teaniel
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.

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

PostPosted: Sat 22 Dec 2012 21:03
by Teaniel
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

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

PostPosted: Sun 23 Dec 2012 08:22
by Bruno Pagès
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

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

PostPosted: Tue 1 Jan 2013 16:08
by Bruno Pagès
Bouml 6.4.2 est disponible et corrige ce problème