Template, namespace, autre ?

Template, namespace, autre ? - C++ - Programmation

Marsh Posté le 11-02-2007 à 12:38:35    

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
Reply

Marsh Posté le 11-02-2007 à 12:38:35   

Reply

Marsh Posté le 11-02-2007 à 15:47:07    

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
Reply

Marsh Posté le 11-02-2007 à 16:33:59    

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
Reply

Marsh Posté le 11-02-2007 à 19:18:15    

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
Reply

Marsh Posté le 11-02-2007 à 20:15:14    

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
Reply

Marsh Posté le 11-02-2007 à 21:09:56    

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 :|
 

Reply

Marsh Posté le 11-02-2007 à 21:30:38    

OK ...
Effectivement, je suis sous VC 2003


---------------
http://otblog.free.fr
Reply

Marsh Posté le 11-02-2007 à 21:41:51    

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

Reply

Marsh Posté le 11-02-2007 à 23:42:51    

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 );

Reply

Marsh Posté le 12-02-2007 à 08:58:35    

++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 ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed