Erreur de compilation : mais pourquoi?
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. :calim2:Mais pourquoi l'une passe et pas l'autre? Alors que les deux sont presque identiques!:cry:
Code:
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 :
Citation:
------ 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:
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...