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!
Message d'erreur :
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; }
Pour mémoire voici la déclaration de ma classe LSC :------ 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é ==========
Merci de votre aide...
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>& ); };








Mais pourquoi l'une passe et pas l'autre? Alors que les deux sont presque identiques!
Répondre avec citation




Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.

Partager