Template et Vector

Template et Vector - C++ - Programmation

Marsh Posté le 22-11-2005 à 20:18:37    

Bonsoir,  
voici un problème que je n'arrive pas à résoudre. Je débute en C++ et avec les STL.
J'ai un problème en ce qui concerne l'ajout d'un objet crée via une template dans un objet Vector:
Voici en gros mon code:

Code :
  1. vector<Pixel *> vpix;
  2. ...
  3. Pixel<unsigned char> *pixel = new Pixel<unsigned char>(1,2,3);
  4. vpix.push_back(pixel);


 
sachant que ma classe pixel est ainsi :
 

Code :
  1. template <class T> class Pixel {
  2. private:
  3.  T R,G,B,Y;
  4. public:
  5.  Pixel(const T R,const T G,const T B) : R(R),G(G),B(B), Y(R+28*G+216*B) {};
  6. ~Pixel() {};
  7. const T& getR()
  8. {
  9.  return R;
  10. };
  11. void setR(const T &R)
  12. {
  13.  this->R = R;
  14. };
  15. const T& getG()
  16. {
  17.  return G;
  18. };
  19. void setG(const T &G)
  20. {
  21.  this->G =G;
  22. };
  23. const T& getB()
  24. {
  25.  return B;
  26. };
  27. void setB(const T &B)
  28. {
  29.  this->B =B;
  30. };
  31. };


 
VC++ me retourne ce message d'erreur  
error C2664: 'std::vector<class Pixel *,class std::allocator<class Pixel *> >::push_back' : impossible de convertir le paramètre 1 de 'Pixel<T> *' en 'Pixel *const & '
        with
        [
            T=unsigned char
        ]
sachant que cette erreur me raméne au push_back.
Pourtant je lui passe bien l'adresse de pixel ce qui semble cohérent étant donné ma définition des types d'objet reçu par vpix....
si une âme charitable pouvait m'aider
cordialement,
caddie

Reply

Marsh Posté le 22-11-2005 à 20:18:37   

Reply

Marsh Posté le 22-11-2005 à 20:28:35    


Code :
  1. vector< Pixel<unsigned char>* > vpix; // la  
  2. ...
  3. Pixel<unsigned char> *pixel = new Pixel<unsigned char>(1,2,3);
  4. vpix.push_back(pixel);


 
et apparemment, tu n'a pas (ou mal) résolu ton probleme précédent :
 
template <class T>
T Pixel<T>::getR() const
{ return R; }
 
pour définir une fonction membre en dehors d'une classe template.

Reply

Marsh Posté le 22-11-2005 à 20:35:13    

je te remercie beaucoup pour la rapidité de ta réponse

Reply

Marsh Posté le 22-11-2005 à 20:36:12    

Bien vu ++fab.
Je me permets d'ajouter que vu que T a de fortes chances d'être à jamais un type simple (char, int, etc), les & me paraissent inutiles.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 22-11-2005 à 20:45:46    

inutile car le gain de performance est infime ou bien pour une autre raison ?

Reply

Marsh Posté le 22-11-2005 à 20:47:57    

t'aura meme une perte de performance, en fait

Reply

Marsh Posté le 22-11-2005 à 20:49:04    

disons qu'on renvoie (const) & quand on balade des objets pour eviter de les recopier (d'ou le const pour eviter que jean louis les modifient), mais sur des types de bases c'est inutile, taille d'une ref est generalement >= taille du type en question

Reply

Marsh Posté le 22-11-2005 à 20:49:47    

chrisbk a écrit :

t'aura meme une perte de performance, en fait


 :heink:  là pour le coup j'ai du mal a suivre je perds en performance en passant par référence un type standard plutôt qu'en le passant par copie ?

Reply

Marsh Posté le 22-11-2005 à 20:51:46    

caddie a écrit :

:heink:  là pour le coup j'ai du mal a suivre je perds en performance en passant par référence un type standard plutôt qu'en le passant par copie ?


 
oui
 
deja, tu n'as aucun gain parce que ton char fait un octet et ta reference, 4. A cet endroit la t'as pas de perte non paske ton cpu 4 octets, il s'en fout. Par contre lorsque tu feras des acces a cette variable, la avec ta réference tu auras une indirection que tu n'aurais pas eu avec une copie
 
 
(attention, tout ceci n'est valable que pour les types de bases, pas les struct, class....)


Message édité par chrisbk le 22-11-2005 à 20:52:11
Reply

Marsh Posté le 22-11-2005 à 20:52:28    

ok merci tu as répondu avant même que je pose la question !

Reply

Marsh Posté le 22-11-2005 à 20:52:28   

Reply

Marsh Posté le 22-11-2005 à 20:53:30    

(l'important ici présentemment, c'est l'indirection, pas la taille)

Reply

Marsh Posté le 22-11-2005 à 20:54:27    

bon apres, question de gout, mais une class pixel jtrouve ca fondamentalement con :d c'est le genre de truc j'y mettrais une structure et zou

Reply

Marsh Posté le 22-11-2005 à 21:00:49    

Ouais je suis d'accord, à vrai dire c'est plus un exercice pour me mettre au c++ qu'autre chose. Si je l'avais fait en C j'aurais en effet utilisé une structure.  
D'ailleurs je dois bien avouer que je pensais prendre en main rapidement le C++ connaissant pas mal le C et je me casse les dents dessus !

Reply

Marsh Posté le 22-11-2005 à 21:01:52    

ouais y'a bcp de concept a chopper et d'habitude a perdre, spa simple

Reply

Marsh Posté le 22-11-2005 à 21:04:37    

chrisbk a écrit :

bon apres, question de gout, mais une class pixel jtrouve ca fondamentalement con :d c'est le genre de truc j'y mettrais une structure et zou


Yep.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 22-11-2005 à 21:22:09    

fais des typedef. ou un paramètre template par défaut

Reply

Marsh Posté le 22-11-2005 à 21:30:39    

et par ailleurs, je pense que tu te fais chier pour rien avec tes get/set sur un pixel ...

Reply

Marsh Posté le 22-11-2005 à 22:55:13    

Code :
  1. template<typename T = unsigned char>
  2. struct Pixel
  3. {
  4. };
  5. #include <vector>
  6. using std::vector;
  7. void foo()
  8. {
  9.    vector< Pixel<> > vp;
  10.    typedef Pixel<int> PixelI;
  11.    vector<PixelI> vi;
  12. }

Reply

Marsh Posté le 23-11-2005 à 09:43:46    

Pourquoi Pixel est-elle template ? Avec la formule de calul de Y, ça me semble un idée assez moyenne.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

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