Salut,
 
   J'ai un message d'erreur :  "[Linker error] undefined reference to `handle<int>::current' "
 
Mon but est en gros de faire une classe qui represente un auto_ptr pour cela un ptr n'encapsule pas directement un T*, mais passe par un "handle" qui compte le nombre de pointeurs qui referencent l'objet pointee.
 
Code :
 - template <typename T>
 - struct handle {  // Doit etre un signleton pour chaque instance differente de pt
 -       int nb; // nombre de references   
 -       T*  pt; // l'objet pointe par pt
 -       static handle<T>* current;
 -      
 -       static handle<T>* get_instance(T* _pt){
 -           // Si creation d'un pointeur sur le même objet
 -           if ( current != NULL && current->pt == _pt ) {
 -              // on augmente le nombre
 -              current->add_ref();
 -              // On renvoi le pointeur précedament enregistré
 -              return current;
 -           } else {
 -              return new handle<T>(1,_pt);   
 -           }
 -       }
 -      
 -       // Constructeur
 -       handle(int _nb = 0, T* _pt = 0){
 -                    nb = _nb;
 -                    pt = _pt;
 -                    current = this;   
 -       }
 -       // Destructeur
 -       ~handle(){
 -           if ( pt != NULL ) delete pt;
 -       }
 -       // Ajout d'une reference
 -       void add_ref(){
 -            nb++;
 -       }
 -       // Suppression d'une reference
 -       void del_ref(){
 -            nb--;
 -            if( nb == 0 && pt != NULL ) delete pt;
 -       }
 -       // Accesseur sur pt
 -       T* get_pt(){ return pt; }
 -       // Get number
 -       int get_nb(){ return nb; }   
 - };
 - // Classe representant un pointeur
 - template <typename T>
 - class ptr {     
 -       public:                                                                                                                                                                                     
 -              // Constructeur
 -              ptr(T* _pt = 0){
 -                     ref = handle<T>::get_instance(_pt);
 -              }           
 -              // Destructeur
 -              ~ptr(){
 -                     if ( ref != NULL ) delete ref;
 -              }
 -            
 -              // Operateur =
 -              ptr& operator=(const ptr<T>& r) {
 -                   if ( (void*)&r != (void*)this ){ // si il n'y a pas d'affecations de this à lui meme
 -                      ref->del_ref();
 -                      ref = r.ref;
 -                   }
 -                   return *this;
 -              }     
 -            
 -              int get_total(){
 -                  return ref->get_nb();
 -              }           
 -              // Operateur *             
 -              // Operateur ->
 -            
 -       private:             
 -              // Le handle
 -              handle<T>* ref;                                   
 - };
 
  | 
 
Donc dans le main L'erreur vient surement de l'appel :   int i = 3;  ptr<int> p1(&i);
 
J'ai testé de mettre la struct directement à l'interieur de la classe ptr mais sans succés.
 
Une idée ?
 
Message édité par Chronoklazm le 09-02-2006 à 23:04:14
 ---------------
			
Scheme is a programmable programming language ! I heard it through the grapevine !