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

  FORUM HardWare.fr
  Programmation
  C++

  Template et virtuelle pure

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Template et virtuelle pure

n°453281
Joel F
Real men use unique_ptr
Posté le 10-07-2003 à 09:42:26  profilanswer
 

y a t il des contre-indications à l'utilisation coinjointe de class template et de methode absatraite ???
 
j'ai une hierarchie de classe template qui dérive tous d'un classe template absatriate et qui surcharge une seule methode virtuelle pure.
 
Ca compile mais a l'execution je me prend des "Illegal function call" dans la tête .... Apres avoir tracer la chose y a des moments ou il ne peut pas récupérer l'adresses de la fonction surchargée dans la vtable et plante lamentablement :/
 
serais-je un idiot ou quoi ???

mood
Publicité
Posté le 10-07-2003 à 09:42:26  profilanswer
 

n°454520
jagstang
Pa Capona ಠ_ಠ
Posté le 10-07-2003 à 23:34:07  profilanswer
 

A mon avis le problème vient d'ailleurs...  
 
Quel compilateur ?
Passe un bout de code

n°454540
Taz
bisounours-codeur
Posté le 10-07-2003 à 23:58:29  profilanswer
 

ouais donne un truc à se mettre sous la dent
 
edit: no problem
 
bien sur faut les destructeurs, je les ai pas ecrit, j'ai pas tenté de compiler, mais ça doit marcher quand meme

Code :
  1. #include <iostream>
  2. using namespace std;
  3. template<class T>
  4. class AbstractFoo
  5. {
  6. public:
  7.   virtual T defaultValue() const =0;
  8.   virtual ~AbstractFoo() {};
  9. };
  10. template<class T>
  11. class AFoo : public AbstractFoo<T>
  12. {
  13.  
  14. public:
  15.   virtual T defaultValue() const
  16.   {
  17.     return T();
  18.   }
  19.  
  20. };
  21. template<int i>
  22. class AbstractBar
  23. {
  24. public:
  25.   virtual int defaultValue() const =0;
  26.   virtual ~AbstractBar() {};
  27. };
  28. template<int i>
  29. class DoubleBar : public AbstractBar<2*i>
  30. {
  31.  
  32. public:
  33.   virtual int defaultValue() const
  34.   {
  35.     return 2*i;
  36.   }
  37.  
  38. };
  39. int main()
  40. {
  41.   const AbstractFoo<int> &aFoo= AFoo<int>();
  42.   cout << aFoo.defaultValue() << endl;
  43.   const AbstractBar<4> &aBar= DoubleBar<2>();
  44.   cout << aBar.defaultValue() << endl;
  45. }


Message édité par Taz le 11-07-2003 à 00:15:24
n°455134
Joel F
Real men use unique_ptr
Posté le 11-07-2003 à 14:20:09  profilanswer
 

Arf désolé pour le reatrd, je bosse avec GCC 3.1 sous project Builder (MAC OS X).
 
En fait pour simplifier mon code ressemble à :
 
 

Code :
  1. template<class T>
  2. class Evaluable
  3. {
  4.    public :
  5.    typedef typename SIMDType<T>::element arg;
  6.    virtual arg eval( const arg& val ) = 0;
  7. };
  8. template<class T,class E>
  9. class EXpression : public Evaluable<T>
  10. {
  11.   public :
  12.   Expression( const E& xpr ) : _xpr(xpr) {}
  13.  
  14.   virtual arg eval( const arg& val)
  15.   {
  16.     // le type E fournit eval()
  17.     return _xpr.eval(val);
  18.   }
  19.  
  20.   private :
  21.   E _xpr;
  22. };
  23. template<class T>
  24. class ExprHolder
  25. {
  26.    public :
  27.    typedef typename SIMDType<T>::element arg;
  28.    template<class E>
  29.    operator=( const Expression<T,E>& xpr )
  30.    {
  31.        my_expr = &xpr;
  32.    }
  33.    arg operator()( const arg& val )
  34.    {
  35.      return my_expr->eval(arg);
  36.    }
  37.    private :
  38.    Evaluable<T>* my_expr;
  39. }

 
 
j'espere etre clir c pas gagné.
Le but etant de fournir une class (ici ExprHolder) à laquelle je puisse
affecté une instance de Expression<T,E> sacahant que le type E est trés complexe et inconnu de l'utilisateur.
 
j'ai une tripotée d'opérateurs surchargée (+,-,/,*) qui construisent un objet Expression<T,E> a partir d'une ecriture du style x+2*ln(x) (expression template en fait).
 
Du style :
 
Variable<double> x,y;
ExprHolder<double> f = ln(x);
ExprHolder<double> g = 2*x;
 
double r = f(g(4));
 
 
*** J'ai corrigé mes erreurs de recopies désolé Taz ***


Message édité par Joel F le 11-07-2003 à 14:41:06
n°455184
Taz
bisounours-codeur
Posté le 11-07-2003 à 14:36:37  profilanswer
 

ché pas. déjà ton code est tres incomplet (il manque les constructeurs (pour les références, ça le fait pas))
 
tes fonctions virtuelles pures ne sont pas implémentées...
t'es sur que ton type E a une méthode eval?
pas la peine de faire des typedef dans tous les sens, tu peux garder celui de classe de base
 
et apres y a plein d'erreurs comme  
 
    my_expr = &xpr;
//...    
  Evaluable<T>& my_expr;

n°455195
Joel F
Real men use unique_ptr
Posté le 11-07-2003 à 14:39:21  profilanswer
 

Désolé, pas bien de poster apres trop de boulot, plus de détails ici :
 
http://forum.hardware.fr/forum2.ph [...] h=&subcat=
 
Je corrige le poste plus haut désolé :(

n°455218
Taz
bisounours-codeur
Posté le 11-07-2003 à 14:44:35  profilanswer
 

tu veux pas checker avec des RTTI avant tes invocations?

n°455249
Joel F
Real men use unique_ptr
Posté le 11-07-2003 à 14:49:50  profilanswer
 

Hmmmm des précisions ??
 
ca me agve severe j'ai juste besoin d'une classe qui encapsule un template quelconque fournissant une methode aprticuliere c pas sorcier qd même  
 :(  :(

n°455286
Taz
bisounours-codeur
Posté le 11-07-2003 à 14:54:58  profilanswer
 

ben on sait jamais et on ne peut pas exclure un bug du compilateur
 
alors avant les trucs critiques tu peux faire plusieurs choses
 
- typeid(truc) == typeid(type_attendu) (il faut stricte équivalence des types
 
- un dynamic_cast  
 
- tu peux aussi en profiter pour t'afficher le nom du type  
   typeid(truc).name()  
   (il te faut <typeinfo> )

n°455316
Joel F
Real men use unique_ptr
Posté le 11-07-2003 à 15:01:09  profilanswer
 

Ok je vais voir ce que ca donne ... sinon y a pas d'autre moyen d'arriver à mes fins ??

mood
Publicité
Posté le 11-07-2003 à 15:01:09  profilanswer
 

n°455342
Taz
bisounours-codeur
Posté le 11-07-2003 à 15:06:59  profilanswer
 

je sais pas franchement, j'ai du mal à saisir ton code par ce qu'incomplet. mais essaye d'abord les RTTI. moi j'ai déjà eu des bugs (sans meme avec des templates, juste une relation d'heritage) avec un 2.95, y a vait un problème au niveau du Type (je crée un new Derivee, mais le vrai type etait Base, donc ça plantait lamentablement). t'as un 3.1, c'est loin d'etre exclu, cette version n'est pas tres réputée

n°455576
Joel F
Real men use unique_ptr
Posté le 11-07-2003 à 17:22:15  profilanswer
 

Arf gagné :D
les types sont pas corrects à l'invocation !!
Bon ben au moins deja ca venait pas de moi :p
 
Merci du coup de pouce !


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

  Template et virtuelle pure

 

Sujets relatifs
Spécialisation template & Pétage de plombAffectation template & héritage
[JAVA] Augmenter la mémoire dispo pour la machine virtuelleTemplate PHPLIB : Comment fonctionne les blocks ?
Plugin et pure DLL windows[PHP] template engine : patTemplate
Attention ca va faire mal : template,inlining et AltiVec en autresun equivalent de HTML template en Java ...
[Resolu] [C++] template et Visual Studio 6.0Template un peu fin
Plus de sujets relatifs à : Template et virtuelle pure


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR