Template et virtuelle pure

Template et virtuelle pure - C++ - Programmation

Marsh Posté le 10-07-2003 à 09:42:26    

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

Reply

Marsh Posté le 10-07-2003 à 09:42:26   

Reply

Marsh Posté le 10-07-2003 à 23:34:07    

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

Reply

Marsh Posté le 10-07-2003 à 23:58:29    

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
Reply

Marsh Posté le 11-07-2003 à 14:20:09    

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
Reply

Marsh Posté le 11-07-2003 à 14:36:37    

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;

Reply

Marsh Posté le 11-07-2003 à 14:39:21    

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

Reply

Marsh Posté le 11-07-2003 à 14:44:35    

tu veux pas checker avec des RTTI avant tes invocations?

Reply

Marsh Posté le 11-07-2003 à 14:49:50    

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

Reply

Marsh Posté le 11-07-2003 à 14:54:58    

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

Reply

Marsh Posté le 11-07-2003 à 15:01:09    

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

Reply

Marsh Posté le 11-07-2003 à 15:01:09   

Reply

Marsh Posté le 11-07-2003 à 15:06:59    

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

Reply

Marsh Posté le 11-07-2003 à 17:22:15    

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 !

Reply

Sujets relatifs:

Leave a Replay

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