Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4815 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Template, namespace, autre ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Template, namespace, autre ?

n°1513186
payen
Posté le 11-02-2007 à 12:38:35  profilanswer
 

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 :
  1. typedef CGAL::Cartesian<double>  K;
  2. typedef K::Point_2          CGAL_Point;
  3. [...]
  4. 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 :

Code :
  1. Point2D <double> p;


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


---------------
http://otblog.free.fr
mood
Publicité
Posté le 11-02-2007 à 12:38:35  profilanswer
 

n°1513272
Joel F
Real men use unique_ptr
Posté le 11-02-2007 à 15:47:07  profilanswer
 

Vite fait à l'arrache :
 

Code :
  1. template<class T, template<class> class R>
  2. struct CGAL2Point
  3. {
  4. typedef R<T>      base;
  5. typedef K::Point_2  type;
  6. };
  7. typedef CGAL2Point< double, CGAL::Cartesian>::type Point;


 
Un simple parametre template template suffit ;)


Message édité par Joel F le 11-02-2007 à 15:47:40
n°1513290
payen
Posté le 11-02-2007 à 16:33:59  profilanswer
 

Salut et merci.

 

Voila ce que j'ai fait

 
Code :
  1. //.hpp
  2. namespace CGAL2MATIS
  3. {
  4. template <class T , template <class> class U> void Transform( const typename U<typename T>::Point_2 &cgal , TPoint2D <typename T> &matis );
  5. }
  6. namespace MATIS2CGAL
  7. {
  8. }
  9. template <class T , template <class> class U> void Transform( const typename U<typename T>::Point_2 &cgal , TPoint2D <typename T> &matis )
  10. {
  11. TPoint2D <typename T> matis(cgal.x(),cgal.y());
  12. return matis;
  13. }


Code :
  1. //main
  2. CGAL::Cartesian<double>::Point_2 pc(0,0);
  3. TPoint2D <double> pm(6,7);
  4. CGAL2MATIS::Transform( pc , pm );
 

Et, j'ai une erreur de compil, classique avec les templates :

 
Code :
  1. error C2783: 'void CGAL2MATIS::Transform(const U<T>::Point_2 &,TPoint2D<T> & )' : impossible de déduire l'argument de modèle de 'U'
  2.        E:\MATIS\Codes\MATIS_DEV\Classes\CGAL2MATIS.h(50) : voir la déclaration de 'CGAL2MATIS::Transform'



Message édité par payen le 11-02-2007 à 16:34:43

---------------
http://otblog.free.fr
n°1513339
Joel F
Real men use unique_ptr
Posté le 11-02-2007 à 19:18:15  profilanswer
 

Citation :


Et, j'ai une erreur de compil, classique quand je comprends pas ce que j'ecris:


[:aloy]
 
Bah l'erreur est clair, il lui manque un parametre template non trivial car le compilateur  
ne peut déduire U et T de tes paramétres vu la gueule de ton prototype. La solution :
 

Code :
  1. template <class T , template <class> class U>
  2. void Transform( const typename U<typename T>::Point_2 &cgal , TPoint2D <typename T> &matis )
  3. {
  4.   TPoint2D <typename T> matis(cgal.x(),cgal.y());
  5.   return matis;
  6. }
  7. CGAL::Cartesian<double>::Point_2 pc(0,0);
  8. TPoint2D <double> pm(6,7);
  9. CGAL2MATIS::Transform<double, CGAL::Cartesian>( pc , pm );


 
Ca devrait marcher ça.
 
Si tu veut un truc completement automatique, va falloir encapsuler ça dans une structure supplémentaire.


Message édité par Joel F le 11-02-2007 à 19:19:40
n°1513354
payen
Posté le 11-02-2007 à 20:15:14  profilanswer
 

Merci de ton ton delicieusement agreable et assez peu donneur de lecon. n passant, j'avais fait la correction dans mon code, mais, certes, pas dans le post. En revanche, ca ne marche toujours pas :  
 

Code :
  1. E:\MATIS\Codes\MATIS_DEV\Classes\CGAL2MATIS.h(58): peut être 'void CGAL2MATIS::Transform<double,CGAL::Cartesian>(const CGAL::Type_equality_wrapper<K_base,Kernel>::Point_2 &,TPoint2D<T> & )'
  2. with
  3. [
  4.    K_base=CGAL::Cartesian_base_ref_count<double,CGAL::Cartesian<double>>,
  5.    Kernel=CGAL::Cartesian<double>,
  6.    T=double
  7. ]
  8. E:\MATIS\Codes\MATIS_DEV\Classes\CGAL2MATIS.h(57): ou       'void CGAL2MATIS::Transform<double,CGAL::Cartesian>(const CGAL::Type_equality_wrapper<K_base,Kernel>::Point_2 &,TPoint2D<T> & )'
  9. with
  10. [
  11.    K_base=CGAL::Cartesian_base_ref_count<double,CGAL::Cartesian<double>>,
  12.    Kernel=CGAL::Cartesian<double>,
  13.    T=double
  14. ]
  15. lors de la tentative de mise en correspondance de la liste des arguments '(CGAL::Type_equality_wrapper<K_base,Kernel>::Point_2, TPoint2D<T> )'
  16. with
  17. [
  18.    K_base=CGAL::Cartesian_base_ref_count<double,CGAL::Cartesian<double>>,
  19.    Kernel=CGAL::Cartesian<double>
  20. ]
  21. and
  22. [
  23.    T=double
  24. ]


Message édité par payen le 11-02-2007 à 20:16:48

---------------
http://otblog.free.fr
n°1513372
Joel F
Real men use unique_ptr
Posté le 11-02-2007 à 21:09:56  profilanswer
 

Ironie, blague, smiley tout ça  :sarcastic: :o [:pingouino]
 
Ensuite, soit y a une erreur dans l'ordre ou la spec de tes paramètres de ton appel de fonction.
Soit, comme je le redoute, tu utilise Visual C++ Express ou 20XX, et là je pense que toutes
tentatives d'utiliser des parametres template templates est vouées à l'echec :|
 

n°1513380
payen
Posté le 11-02-2007 à 21:30:38  profilanswer
 

OK ...
Effectivement, je suis sous VC 2003


---------------
http://otblog.free.fr
n°1513383
Joel F
Real men use unique_ptr
Posté le 11-02-2007 à 21:41:51  profilanswer
 

donc, je confirmerais ça plus tard, mais je pense que c'ets mort

n°1513430
++fab
victime du syndrome IH
Posté le 11-02-2007 à 23:42:51  profilanswer
 

Pas sur que ce soit le problème, mais bon :
 
template <class T , template <class> class U>
void Transform( const typename U<typename T>::Point_2 &cgal , TPoint2D <typename T> &matis );

n°1513456
Joel F
Real men use unique_ptr
Posté le 12-02-2007 à 08:58:35  profilanswer
 

++fab a écrit :

Pas sur que ce soit le problème, mais bon :
 
template <class T , template <class> class U>
void Transform( const typename U<typename T>::Point_2 &cgal , TPoint2D <typename T> &matis );


 
Ah j'avais pas vu effectivement ...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Template, namespace, autre ?

 

Sujets relatifs
Template Joomla compliqué à réaliser ? Accessibilité ?template forum phpbb
fonction template et arguments variablesProblème de Namespace (EXSLT)
charger un xml avec un template xsl en javascript ? [résolu]Comment déclarer un pointer sur classe template ?
[C#/résolu] type template avec méthodes connues par avance[HTML]Créer un template
Regex pour parser template phpStandard pour template - nontype
Plus de sujets relatifs à : Template, namespace, autre ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)