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 :

Classe template imbriquées


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Nenyan
    Profil pro
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut Classe template imbriquées
    Bonjour,
    je viens ici demander un peu d'aide : je suis en train d'écrire une librairie de classe template, qui permet entre autre de gérer des piles, des files, des listes doublement chaînées... dans un but autodidactique, et je bloque sur ce point :

    Soit delement<T> une classe template de gestion des éléments des classes suivantes, dstack<T> une classe template de gestion de l'utilisation de données sous forme de pile, et dlinkedlist<T> une classe template de gestion de liste doublement chainée.

    J'en suis arrivé à écrire une fonction dlinkedlist<T>::find qui recherche les éléments de la liste doublement chainée par valeur, en partant du début, et qui ajoute des pointeurs delement<T>* dans un objet dstack<delement<T>*> qui sera ensuite retourné, et la, ça bloque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur	1	error C2664: 'dstack<T>::push'*: impossible de convertir le paramètre 1 de 'delement<T> *' en 'delement<T> *'
    Cette erreur est notée par le compilateur ici, sur la ligne ou j'ai rajouté un #

    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
    template <class T>
    dstack<delement<T>*> dlinkedlist<T>::find(T data, unsigned int n_how)
    {
    	// buffer stack and current pointer
    	dstack<delement<T>*> s;
    	delement<T>* p = this->mp_head;
     
    	if (!this->mp_tail)		// return an empty stack
    		return s;
     
    	while(p)
    	{
    #		s.push(p);
    		p = p->next();
    	}
     
    	return s;
    }
    Le paramètre n_how n'est pas encore implémenté, pour le moment, la fonction recherche tous les éléments, jusqu'a la fin de la liste

    Je met à disposition tous les fichiers sur mon serveur ftp dans un soucis de lisibilité du post.
    Les fichiers .inl correspondent à la définition des fonctions des class template. J'ai rajouté un #include "fichier.inl" à la fin du .h pour éviter les erreurs de link si on définit ces fonctions dans un .cpp.

    // classe delement<T>
    http://ekinai.free.fr/dtl/delement.inl
    http://ekinai.free.fr/dtl/delement.h

    // classe dstack<T>
    http://ekinai.free.fr/dtl/dstack.h
    http://ekinai.free.fr/dtl/dstack.inl

    // classe dlinkedlist<T>
    http://ekinai.free.fr/dtl/dlinkedlist.h
    http://ekinai.free.fr/dtl/dlinkedlist.inl

    Je dois avouer que ça fait longtemps que je n'ai pas programmé en C++, je me suis replongé très récemment la dedans et c'est la première fois que j'utilise des template.

    Je commence à me demander,en fait, s'il est possible de faire ce que je veux faire.

    Ai-je fais une erreur de conception ?

    Merci d'avance

  2. #2
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Le message de ton compilateur me parait étonnant. Tu es sur que le message est exactement comme tu nous l'a envoyé ?

    Sinon, n'oublie pas de profiter des avantages de coder sous Visual :

    Pour résoudre l'erreur C2664 :
    Vérifiez à nouveau le prototype de la fonction concernée et corrigez l'argument noté dans le message d'erreur.
    Prévoyez une conversion explicite si nécessaire.
    L'erreur C2664 peut également être générée si une classe masque un membre dans l'une de ses classes de base.

    Cf. msdn

    C'est vraiment bizarre on dirait que ton compilateur n'arrive pas à assimiler ton paramètre comme étant le type de paramètre attendu... t'as essayé de le caster en ... lui même ?

    du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    s.push((delement<T>*)p);
    //ou encore 
    s.push<delement<T>*>(p);
    En tout cas j'avais jamais vu ce type d'erreur il y a de quoi se tirer les cheveux

  3. #3
    Membre averti Avatar de Nenyan
    Profil pro
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut


    Oui, j'ai essayé de caster, avec le cast de C, avec dynamic_cast, reintepret_cast, ça ne fonctionne pas, il me répond que la conversion est impossible ><

    Ces templates, c'est en train de me rendre fou

  4. #4
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    Bonjour,

    En compilant le code suivant (avec tes en-têtes, en supprimant la ligne 126 de dlinkedlist.inl, qui semble être une typo) avec g++, j'ai un message d'erreur plus explicite:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "dlinkedlist.h"
     
    template class dlinkedlist<int*>;
    J'obtiens ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dlinkedlist.inl:196:3: error: no matching function for call to ‘dstack<delement<int*>*>::push(delement<int*>*&)’
    dlinkedlist.inl:196:3: note: candidate is:
    In file included from dstack.h:33:0,
                     from dlinkedlist.h:7,
                     from dlinkedlist-inst.cpp:1:
    dstack.inl:28:6: note: void dstack<T>::push(delement<T>*) [with T = delement<int*>*]
    dstack.inl:28:6: note:   no known conversion for argument 1 from ‘delement<int*>*’ to ‘delement<delement<int*>*>*’
    Le T de s est déjà un delement<T>*, il te faut donc passer un delement<delement<T>*>* à s.push().

    Par contre, si tu utilise une version à jour de Visual, tu peux signaler un bug pour le message d'erreur, il est mauvais. Tu aurais trouvé l'erreur tout seul avec un bon message d'erreur.

  5. #5
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Je dirais plutôt que pour l'utilisation qu'il souhaite en faire, il faut que le prototype de push prenne T en paramètre, seulement.

    En tout cas bien joué pour le courage d'avoir repris ce code et de l'avoir testé ^^

  6. #6
    Membre averti Avatar de Nenyan
    Profil pro
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Bonjour, je viens d'avoir du temps pour regarder vos réponses, et merci beaucoup ! It works !

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

Discussions similaires

  1. Problèmes de fonctions membres de classe templates, gcc3.3.6
    Par yves.dessertine dans le forum Autres éditeurs
    Réponses: 12
    Dernier message: 17/10/2005, 21h36
  2. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  3. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56
  4. Class template hérité
    Par Azharis dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2005, 22h03
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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