IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

nested class dans un class template


Sujet :

Langage C++

  1. #1
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut nested class dans un class template
    Bonjours,

    Je cherche à implémenter une patron de classe pour une liste simplement chainée ( LSC ).
    J'ai d'abord commencé par implémenter une classe LSC permettant de lister des entiers : tout s'est bien passé. Partant de celle-ci j'ai implémenté le partron de classe pour des listes de <class T>. Pour la liste seule, tout va bien...
    ...Mais dès que j'ajoute la classe imbriquée 'iterator' impossible de comprendre le problème et d'y remédier!

    Voici un extrait de mon 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    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
    	// Ne pas oublier de faire 'contructeur de recopie' et 'operator ='...
     
    	void push_front ( T );
    	void pop_front ();
     
    	iterator begin ();
    	iterator end ();
     
    	template <class T> friend std::ostream& operator << ( std::ostream&, LSC<T>& );
    };
    et , à la suite dans le même *.h, on a entre autre :
    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
    template <class T> LSC<T>::iterator::iterator ()
    {
    	noeudPointe = NULL;
    	objet = NULL;
    }
     
    template <class T> LSC<T>::iterator::iterator ( noeud* pnd, T* pn )
    {
    	noeudPointe = pnd;
    	objet = pn;
    }
    //********************
     
    template <class T> LSC<T>::iterator& LSC<T>::iterator::operator = ( LSC<T>::iterator& it )
    {
    	if ( this != &it )
    	{
    		noeudPointe = it.noeudPointe;
    		objet = it.objet;
    	}
     
    	return *this;
    }
    ...
    à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <class T> LSC<T>::iterator& LSC<T>::iterator::operator = ( LSC<T>::iterator& it )
    le compilateur me dit :
    d:\visual studio 2010\projects\liste\liste\lsc.h(106) : warning C4346: 'LSC<T>::iterator'*: le nom dépendant n'est pas un type
    préfixer avec 'typename' pour indiquer un type
    d:\visual studio 2010\projects\liste\liste\lsc.h(106) : error C2143: erreur de syntaxe*: absence de ';' avant '&'
    d:\visual studio 2010\projects\liste\liste\lsc.h(106) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    d:\visual studio 2010\projects\liste\liste\lsc.h(106) : fatal error C1903: impossible de récupérer à partir des erreurs précédentes*; arrêt de la compilation
    Les constructeurs passent bien, mais comment déclarer correctement mes 'operator' pour que ça passe???

    J'ai regadé mais ça ne m'aide pas plus que ça!!

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template <class T> LSC<T>::iterator& LSC<T>::iterator::operator = ( LSC<T>::iterator& it )
    Doit être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <class T> typename LSC<T>::iterator& LSC<T>::iterator::operator = ( typename LSC<T>::iterator& it )
    Si c'est bien elle la ligne 106 de ton fichier. Lorsque le compilateur rencontre quelque chose de la forme type<T>::autre_type, il ne sait pas que c'est un type (le fait est que selon les spécialisation de type<T>, ça peut être n'importe quoi, voire ne pas exister). Du coup, tu est obligé de lui dire que c'est un type grâce au mot-clef typename.

    Accessoirement, l'opérateur= prends un const type& , par un type& ; la valeur passée n'est pas censée être modifiée
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Accessoirement, l'opérateur= prends un const type& , par un type& ; la valeur passée n'est pas censée être modifiée
    Voir (mieux) par valeur.

  4. #4
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Merci Emmanuel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Une Classe dans une Classe. C'est possible?
    Par FrankOVD dans le forum Langage
    Réponses: 2
    Dernier message: 18/05/2006, 22h02
  2. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34
  3. Une classe dans une classe...
    Par Baquardie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2005, 19h36
  4. Class dans une Class
    Par Math75 dans le forum C++
    Réponses: 27
    Dernier message: 06/08/2004, 17h38
  5. classe dans une classe ?
    Par tut dans le forum UML
    Réponses: 23
    Dernier message: 25/06/2004, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo