specialisation partielle d'une fonction d'un patron de classe

specialisation partielle d'une fonction d'un patron de classe - C++ - Programmation

Marsh Posté le 13-11-2007 à 11:46:59    

Bonjour à tous,  
voila mon code  
 

Code :
  1. template <class T> class vector
  2. {
  3.       T * data;
  4.       int sz;
  5.       public:
  6.              vector(int n):sz(n) {data=new T[sz];}
  7.              ~vector() {delete[] data;}
  8.              T & operator[](int i){return data[i];}
  9.              vector<T> & operator= (const vector<T> & );
  10.              vector<T> (const vector<T> & );
  11.              void affiche() {cout<<data<<endl;}
  12.              T operator[](int i) const {return data[i];}
  13.              int size() const {return sz;}
  14. };     
  15. template <class T> vector<T> & vector<T>::operator =(const vector<T> & x)
  16. {
  17.                delete[] data;
  18.                sz=x.sz;
  19.                data=new T[sz];
  20.                for (int i=0; i<=sz-1; i++)
  21.                {
  22.                    data[i]=x.data[i];
  23.                } 
  24.                return *this;
  25. }
  26.              
  27. template <class T> vector<T>::vector<T>(const vector<T> & x)
  28. {
  29.        
  30.          sz=x.sz;
  31.          data=new T[sz];
  32.          for (int i=0; i=sz-1; i++)
  33.                {
  34.                    data[i]=x.data[i];
  35.                } 
  36. }
  37.  
  38. vector<T*> & vector<T*>::operator =(const vector<T*> & x)
  39. {
  40.                delete[] data;
  41.                sz=x.sz;
  42.                data=new (T*)[sz];
  43.                for (int i=0; i<=sz-1; i++)
  44.                {
  45.                    if (*(data[i])==0)
  46.                    {*(data[i])=*(x.data[i]);}
  47.                    else data[i]=x.data[i];
  48.                } 
  49.                return *this;
  50. }
  51. vector<T*>::vector<T*>(const vector<T*> & x)
  52. {
  53.        
  54.          sz=x.sz;
  55.          data=new (T*)[sz];
  56.          for (int i=0; i=sz-1; i++)
  57.                {
  58.                    if (*(data[i])==0)
  59.                    {*(data[i])=*(x.data[i]);}
  60.                    else data[i]=x.data[i];
  61.                } 
  62. }


 
Alors je vous explique, je crée une classe vector, munit d'un tableau dynamique, et je cherche a specialiser mon operateur d'affectation ( = ) et mon operateur de copie de la classe dans le cas ou le tableau est lui même un tableau de pointeur. En effet il faudra alors faire une deep copie, car si non au lieu de copier les valeurs pointés par les cases du tableau, je copierai les adresses, ce qui n'a aucun interet.
 
Le probleme est que, je sais proceder a une specialisation de fonction de classe, pas de probleme ou a une specialisation partielle de classe, pas de probleme, mais comment faire pour proceder a une specialisation partielle de fonction de classe, quelle est la syntaxe.
 
Je voudrait toujours garder le type T indéfini dans la nouvelle definition de l'operateur= et affectation mais les specialiser en type T* pour pouvoir dans ce cas la effectuer la deep copie.
 
Il s'agit donc de declarer de maniere adequate les deux dernieres fonctions que vous voyez.
 
 
Merci d'avance a qui pourra m'indiquer la syntaxe correcte.


Message édité par MVL2 le 13-11-2007 à 11:50:31
Reply

Marsh Posté le 13-11-2007 à 11:46:59   

Reply

Marsh Posté le 13-11-2007 à 12:13:21    

J'ai trouvé une autre possibilité, j'ai carrément procedé a une specialisation partielle de la classe toute entiere puis redeclaré les fonctions concernées.
 

Code :
  1. template <class T> class vector
  2. {
  3.       T * data;
  4.       int sz;
  5.       public:
  6.              vector(int n):sz(n) {data=new T[sz];}
  7.              ~vector() {delete[] data;}
  8.              T & operator[](int i){return data[i];}
  9.              vector<T> & operator= (const vector<T> & );
  10.              vector<T> (const vector<T> & );
  11.              void affiche() {cout<<data<<endl;}
  12.              T operator[](int i) const {return data[i];}
  13.              int size() const {return sz;}
  14. };     
  15. template <class T> class vector<T*>
  16. {
  17.       T * * data;
  18.       int sz;
  19.       public:
  20.              vector(int n):sz(n) {data=new T*[sz];}
  21.              ~vector() {delete[] data;}
  22.              T* & operator[](int i){return data[i];}
  23.              vector<T*> & operator= (const vector<T*> & );
  24.              vector<T*> (const vector<T*> & );
  25.              void affiche() {cout<<data<<endl;}
  26.              T* operator[](int i) const {return data[i];}
  27.              int size() const {return sz;}
  28. };     
  29. template <class T> vector<T> & vector<T>::operator =(const vector<T> & x)
  30. {
  31.                delete[] data;
  32.                sz=x.sz;
  33.                data=new T[sz];
  34.                for (int i=0; i<=sz-1; i++)
  35.                {
  36.                    data[i]=x.data[i];
  37.                } 
  38.                return *this;
  39. }
  40.              
  41. template <class T> vector<T>::vector<T>(const vector<T> & x)
  42. {
  43.        
  44.          sz=x.sz;
  45.          data=new T[sz];
  46.          for (int i=0; i=sz-1; i++)
  47.                {
  48.                    data[i]=x.data[i];
  49.                } 
  50. }
  51.  
  52. template <class T>  vector<T*> & vector<T*>::operator =(const vector<T*> & x)
  53. {
  54.                delete[] data;
  55.                sz=x.sz;
  56.                data=new T*[sz];
  57.                for (int i=0; i<=sz-1; i++)
  58.                {
  59.                    if (*(data[i])==0)
  60.                    {*(data[i])=*(x.data[i]);}
  61.                    else data[i]=x.data[i];
  62.                } 
  63.                return *this;
  64. }
  65. template <class T> vector<T*>::vector<T*>(const vector<T*> & x)
  66. {
  67.        
  68.          sz=x.sz;
  69.          data=new T*[sz];
  70.          for (int i=0; i=sz-1; i++)
  71.                {
  72.                    if (*(data[i])==0)
  73.                    {*(data[i])=*(x.data[i]);}
  74.                    else data[i]=x.data[i];
  75.                } 
  76. }


 
Mais est-on obligé de proceder a une specialisation partielle de classe, ne peut pas pas proceder uniquement a une specialisation partielle des fonctions membres pour T*?
 
Merci


Message édité par MVL2 le 13-11-2007 à 12:14:03
Reply

Marsh Posté le 13-11-2007 à 12:29:55    

c'est ça. Il n'y a pas de spécialisation partielle de fonction template. Pour résoudre le problème sans tout dupliquer, utilise une classe mère dont hérite la version générique et la version spécialisée.

Reply

Marsh Posté le 13-11-2007 à 12:51:12    

Ok merci Taz pour l'info.

Reply

Sujets relatifs:

Leave a Replay

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