Bonjour,

toujours dans ce projet j'ai maintenant une erreur de compilation.
(je vous présente d'abord les extraits de code PUIS les questions)
(dans les extraits suivants je coupe volontairement le code)

J'ai créé un noeud
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
template <typename T>
struct DNode
{
    T val;				//!< Value for this node, can be anything
    DNode<T> *prev;			//!< Pointer to the previous node
    DNode<T> *next;			//!< Pointer to the next node
    // constructeur par défaut et copie mais pas destructeur et autres méthodes pratiques
    //! Destructor is useless because automatically called when deleting struct DNode, setting a destructor will cause calling ~T twice
    /*~DNode()
    {
    	//! Default destructor
    	//! @todo : if val = NULL, what happens when calling its destructor ?
    	val.~T();	// explicit call to the destructor
    }*/
}
puis la liste avec sentinelles
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
template <typename T>
class DLList
{
	// typedef struct DNode<T> Node;	this could be used to simplify the writing
        friend class testDLList;        // provide access for a test class
        friend class testIterators;
	private :
		DNode<T>* head;		//! Handle on first data node (if any)
		DNode<T>* tail;		//! Handle on last data node (if any)
		DNode<T>* fore;		//! Handle on leading sentinel node
		DNode<T>* aft;		//! Handle on trailing sentinel node
		unsigned int m_size;	//! Holds the number of nodes
    // constructeurs, méthodes, destructeurs, itérateurs ...
}

Je vais utiliser cette liste pour stocker des pointeurs d'une classe TranslatableObserver disons donc quelque part j'ai ça en membre d'une classe :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
DLList<TranslatableObserver*> list;
Ensuite, j'ai l'erreur de compilation suivante :
error: invalid conversion from ‘void*’ to ‘DNode<TranslatableObserver*>*’
l'erreur se situe dans le destructeur de ma DLList donc voici le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
template <typename T>
DLList<T>::~DLList(void)
{
	// Deallocate all nodes, even the sentinels
	DNode<T>* temp = NULL;
	while(fore != NULL)
	{
		temp = fore;
		fore = fore->next;
		delete temp;
	}
        // the following statement is not completely true :
        // Don't need to set head and tail to NULL nor m_size to 0 because we don't care right now
        head = NULL;
        tail = NULL;
        fore = NULL;
        aft = NULL;
        m_size = 0;
}
Le problème se situe sur les "= NULL", avec dans mon cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
#define NULL ((void*)0)
Les questions :
1 - Vous remarquez que j'ai volontairement dégagé struct DNode<T>::~DNode<T>() (ou tout simplement le destructeur d'un noeud).
Lors de mes tests j'ai crée une classe 'personne' comportant un membre int et un tableau name avec allocation dynamique. Dans le destructeur de 'personne' je faisais un delete de 'name' sans mettre 'name' à NULL, chose que j'avais jugée inutile.
Ensuite, je stockais une liste de 'personne', les noeuds étant donc des 'personne'.
Je me suis aperçu lors du debug qu'en détruisant un noeud je passais deux fois dans le destructeur de 'personne' et puisque personne::name n'avait pas été mis à NULL la première fois alors plantage. La seule solution que j'ai trouvé a été d'enlever le destructeur d'un noeud pour éviter que struct DNode<T>::~T() soit appelé deux fois. Pourquoi est-il appelé deux fois ?

2 - Pourquoi pour résoudre mon erreur de compilation je peux mettre 0 à la place de NULL ?