IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Template, namespace ?


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut Template, namespace ?
    Bonjour a tous,

    Je souhaite utiliser la librairie CGAL pour quelques algorithmes geometriques. Or, CGAL utilise ses propres objets geometriques de base (points, segments, ...) ce qui est tout ce qu'il y a de plus normal. Ces objets sont tous des templates.
    Par ailleurs, la ou je bosse, nous avons notre propre librairie qui a aussi ses objets geometriques qui sont des templates simples. Aussi, je, voudrais ecrire deux namespaces qui permettraient de faire les transformations d'objets dans les deux sens (cgal2matis et matis2cgal).
    Je ne sais pas comment m'y prendre, vu la strucutre des templates de deux cotes. Je m'explique. Par exemple, sous CGAL pour declarer un point 2D, on fait comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef CGAL::Cartesian<double>		K;
    typedef K::Point_2			       CGAL_Point;
     
    [...]
     
    Point_2 p;
    On declare donc l'espace (Cartesian) dans lequel on travaille et son type (double).
    Dans ma lib, ca se passe comme ca :
    Dans CGAL, l'espace peut etre Cartesian, mais aussi Simple_cartesian, Homogeneous ... Ou, encore plus complique Exact_predicates_exact_constructions_kernel ... Au final, je ne sais pas du tout comment faire ce que j'ai decrit au debut. Cela vient du fait que dans CGAL on a des templates dans des templates.

    Un coup de main serait le bienvenu ...

    D'avance merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    En admettant qu'on a le modèle suivant pour un noyau cartésien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<typename CoordType>
    struct Cartesian
    {
            struct Point
            {
            };
    };
    Et un noyau homogène :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<typename CoordType>
    struct Homogeneous
    {
            struct Point
            {
            };
    };
    Et pour ton point à toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<typename CoordType>
    struct Point
    {
    };
    Alors tu peux écrire la fonction template suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<typename CoordType, template<typename T> class Kernel>
    void
    f()
    {
            typename Kernel<CoordType>::Point p1;
            Point<CoordType> p2;
    };
    Et l'appeler de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main()
    {
            f<double, Homogeneous>();
    }
    gcc gère les templates de template depuis pas mal de temps, je ne sais pas comment réagit Visual C++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    Salut et merci.

    Dans le .hpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    namespace CGAL2MATIS
    {
    	template <class T , template <class> class U> void Transform( const typename U<typename T>::Point_2 &cgal , TPoint2D <typename T> &matis );
    }
     
    namespace MATIS2CGAL
    {
    }
     
    template <class T , template <class> class U> void Transform( const typename U<typename T>::Point_2 &cgal , TPoint2D <typename T> &matis )
    {
    	matis.set(cgal.x(),cgal.y());
    }
    Dans mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CGAL::Cartesian<double>::Point_2 pc(0,0);
    TPoint2D <double> pm(6,7);
    CGAL2MATIS::Transform<double,CGAL::Cartesian>( pc , pm );
    Cette petite merveille compile, mais ne link pas sous VC++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error LNK2019: symbole externe non résolu "void __cdecl CGAL2MATIS::Transform<double,struct CGAL::Cartesian>(class CGAL::Point_2<struct CGAL::Cartesian<double> > const &,class TPoint2D<double> &)
    Une idee ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Je ne suis pas assez familier avec CGAL pour savoir exactement d'où ça vient.

    Première solution, le code de ta fonction n'est pas accessible au linker (genre le projet est mal configuré, ou tu ne fais pas d'include du code de la fonction template dans le header).

    Deuxième solution, CGAL fait des trucs étranges : dans ce que tu montres, le point est contenu dans le noyau. Le message d'erreur (et la doc de CGAL) montre le noyau en paramètre template du point. Peut être qu'un forum dédié à CGAL saura mieux te renseigner.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par roulious
    Deuxième solution, CGAL fait des trucs étranges : dans ce que tu montres, le point est contenu dans le noyau. Le message d'erreur (et la doc de CGAL) montre le noyau en paramètre template du point. Peut être qu'un forum dédié à CGAL saura mieux te renseigner.
    Oui, c'est aussi ce que je trouve bizarre ...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    Bon, c'etait un erreur stupide, il suffisait de mettre l'implementation de la fonction dans le namespace ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/03/2011, 12h07
  2. [XSLT][namespace] Création worksheet via template
    Par Graineur dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 09/11/2010, 00h23
  3. template et namespace
    Par ben56 dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2008, 11h26
  4. Template et namespace
    Par bolhrak dans le forum Langage
    Réponses: 2
    Dernier message: 11/08/2007, 01h51
  5. xsl:Template sur un élément sans namespace
    Par dust45 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 27/10/2005, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo