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

  FORUM HardWare.fr
  Programmation
  C++

  Template et Vector

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Template et Vector

n°1251000
caddie
Posté le 22-11-2005 à 20:18:37  profilanswer
 

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

mood
Publicité
Posté le 22-11-2005 à 20:18:37  profilanswer
 

n°1251009
++fab
victime du syndrome IH
Posté le 22-11-2005 à 20:28:35  profilanswer
 


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.

n°1251010
caddie
Posté le 22-11-2005 à 20:35:13  profilanswer
 

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

n°1251012
el muchach​o
Comfortably Numb
Posté le 22-11-2005 à 20:36:12  profilanswer
 

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
n°1251028
caddie
Posté le 22-11-2005 à 20:45:46  profilanswer
 

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

n°1251031
chrisbk
-
Posté le 22-11-2005 à 20:47:57  profilanswer
 

t'aura meme une perte de performance, en fait

n°1251033
chrisbk
-
Posté le 22-11-2005 à 20:49:04  profilanswer
 

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

n°1251035
caddie
Posté le 22-11-2005 à 20:49:47  profilanswer
 

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 ?

n°1251041
chrisbk
-
Posté le 22-11-2005 à 20:51:46  profilanswer
 

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
n°1251044
caddie
Posté le 22-11-2005 à 20:52:28  profilanswer
 

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

mood
Publicité
Posté le 22-11-2005 à 20:52:28  profilanswer
 

n°1251045
chrisbk
-
Posté le 22-11-2005 à 20:53:30  profilanswer
 

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

n°1251047
chrisbk
-
Posté le 22-11-2005 à 20:54:27  profilanswer
 

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

n°1251061
caddie
Posté le 22-11-2005 à 21:00:49  profilanswer
 

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 !

n°1251062
chrisbk
-
Posté le 22-11-2005 à 21:01:52  profilanswer
 

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

n°1251065
el muchach​o
Comfortably Numb
Posté le 22-11-2005 à 21:04:37  profilanswer
 

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
n°1251074
Taz
bisounours-codeur
Posté le 22-11-2005 à 21:22:09  profilanswer
 

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

n°1251079
Taz
bisounours-codeur
Posté le 22-11-2005 à 21:30:39  profilanswer
 

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

n°1251127
Taz
bisounours-codeur
Posté le 22-11-2005 à 22:55:13  profilanswer
 

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

n°1251252
HelloWorld
Salut tout le monde!
Posté le 23-11-2005 à 09:43:46  profilanswer
 

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

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

  Template et Vector

 

Sujets relatifs
Création de templatefriend surcharge class template
template et gcc3.4.2Du vector à la NullPointerException, pourquoi ?
[G++] Héritage de classe template, je sais c'est redondantTrier un vector de pointeurs
Template PHPlib : Include();[C++] instanciation template
Redéfinition du flux et template[Visual C++] : Pb vector.resize()
Plus de sujets relatifs à : Template et Vector


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