Boujours à tous,

Après l'aide à la résolution du problème dans la discussion : "nested class dans un class template", j'ai voulu compléter ma classe "LSC" (liste simplement chainée) avec son contructeur de recopie et son opérateur d'affectation. C'est là qu'est l'os : Je ne comprend pas d'ou vient l'erreur de compilation!
J'explique : La première fonction ( le constructeur de recopie ) est compilée sans problème... mais la deuxième ( l'opérateur d'affectation ) plante à la ligne indiquée en remarque. Mais pourquoi l'une passe et pas l'autre? Alors que les deux sont presque identiques!
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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
template <class T> LSC<T>::LSC ( const LSC<T>& liste )
{
	debut = NULL;
	fin = NULL;
	size = 0;
 
	LSC<T>::iterator it;
	for ( int i = liste.size; i > 0; i-- )
	{
		it = liste.begin();
		for ( int j = 0; j < i; j++ )
			it++;
		this->pop_front( it->objet );
	}
}
 
template <class T> LSC<T>& LSC<T>::operator = ( const LSC<T>& liste ) //L143
{                                                                     //L144
	if ( this != &liste )                                         //L145
	{                                                             //L146
		debut = NULL;                                         //L147
		fin = NULL;                                           //L148
		size = 0;                                             //L149
                                                                      //L150
		LSC<T>::iterator it;                                  //L151
		for ( int i = liste.size; i > 0; i-- )                //L152
		{                                                     //L153
			it = liste.begin(); // L154 : ça plante ici en compilation!
			for ( int j = 0; j < i; j++ )
				it++;
			this->pop_front( it->objet );
		}
	}
 
	return *this;
}
Message d'erreur :
------ Début de la génération*: Projet*: Liste, Configuration*: Debug Win32 ------
Compilation en cours...
liste.cpp
d:\visual studio 2010\projects\liste\liste\lsc.h(154) : error C2662: 'LSC<T>::begin'*: impossible de convertir un pointeur 'this' de 'const LSC<T>' en 'LSC<T> &'
with
[
T=int
]
La conversion perd les qualificateurs
d:\visual studio 2010\projects\liste\liste\lsc.h(144)*: lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
d:\visual studio 2010\projects\liste\liste\liste.cpp(10)*: voir la référence à l'instanciation de la classe modèle 'LSC<T>' en cours de compilation
with
[
T=int
]
d:\visual studio 2010\projects\liste\liste\lsc.h(157) : error C2819: le type 'LSC<T>::iterator' n'a pas d'opérateur 'operator ->' de membre surchargé
with
[
T=int
]
d:\visual studio 2010\projects\liste\liste\lsc.h(22)*: voir la déclaration de 'LSC<T>::iterator'
with
[
T=int
]
souhaitez-vous utiliser '.' à la place*?
d:\visual studio 2010\projects\liste\liste\lsc.h(157) : error C2232: '->LSC<T>::iterator::objet'*: opérande gauche avec type 'class', utilisez '.'
with
[
T=int
]
d:\visual studio 2010\projects\liste\liste\lsc.h(157) : error C2660: 'LSC<T>::pop_front'*: la fonction ne prend pas 1 arguments
with
[
T=int
]
Le journal de génération a été enregistré à l'emplacement "file://d:\visual studio 2010\Projects\Liste\Liste\Debug\BuildLog.htm"
Liste - 4 erreur(s), 0 avertissement(s)
========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
Pour mémoire voici la déclaration de ma classe LSC :
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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
template <class T> class LSC	// Liste Simplement Chainée
{
private:
	struct noeud {
		T* objet;
		noeud* suivant; };
	noeud* debut;		// Pointeur sur le premier noeud
	noeud* fin;			// Pointeur sur le dernier noeud
	unsigned int size;	//Taille de la liste
 
public:
	class iterator
	{
	private:
		noeud* noeudPointe;
		T* objet;
	public:
		iterator ();
		iterator ( noeud*, T* );
 
		iterator& operator = ( iterator& );
		iterator& operator ++ ( int );	// ++ postfixé!
		T operator * ();
 
		bool operator == ( iterator& );
		bool operator != ( iterator& );
	};
	LSC ();	// Constructeur usuel
	~LSC ();// Destructeur
	LSC ( const LSC<T>& );	// Constructeur de recopie
	LSC<T>& operator = ( const LSC<T>& ); //affectation
 
	void push_front ( const T& );
	void pop_front ();
 
	iterator begin ();
	iterator end ();
 
	template <class T> friend std::ostream& operator << ( std::ostream&, LSC<T>& );
};
Merci de votre aide...