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 :

Erreur Gcc, template et iterator


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Par défaut Erreur Gcc, template et iterator
    Bonjour,

    j'essaye depuis un petit bout de temps de compiler un programme, et pas moyen. Donc je craque et je m'en remet à vos conseils avisés

    J'essaye dans une classe (qui n'est pas template) de définir deux methodes comme suis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T> list<T>::iterator findProxi(list<T>& l,Element elem);
    template<typename T> list< pair<T,T> >::iterator findProxi(list< pair<T,T> >& l,Element elem);
    et le compilateur butte sur ces lignes, en me disant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: expected constructor, destructor, or type conversion before 'findProxi'
    pour chacune des lignes au dessus. Et si je met un type défini (genre Element, qui est une de mes classes) plutot que le type générique T, ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list<Element>::iterator findProxi(list<Element>& l,Element elem);
    Et pareil si je retire le ::iterator dans le type de retour, ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<typename T> list<T> findProxi(list<T>& l,Element elem);
    Alors si vous savez pourquoi, et surtout comment on corrige... Je vous en serait éternellement reconnaissant

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T> typename list<T>::iterator findProxi(list<T>& l,Element elem);
    template<typename T> typename list< pair<T,T> >::iterator findProxi(list< pair<T,T> >& l,Element elem);
    list<T>::iterator est un nom dependant d'un paramètre template, donc il faut le faire précéder de typename quand il désigne un type.

    Petite remarque: je déconseille fortement et même dans les entêtes. Ca les force dans tous les fichiers qui font l'inclusion et ça peut leur donner des conflits qu'ils peuvent difficilement résoudre.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Par défaut
    C'est génant si je vous embrasse?
    Pfiou ça fait 1semaine que je scrute google, que je tente des trucs.. j'avais essayé typename mais devant template, dommage !

    Bon ben c cool, ça marche
    Merci enormément!

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par aidos
    C'est génant si je vous embrasse?
    Je le crains. Aidos c'est un peu asexué, si vous êtes une femme ça risque géner la mienne, si vous êtes un homme ça ne m'attire pas trop ;-)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Par défaut
    bon et bien vous devrez vous contentez de ma gratitude merci encore!
    (et aidos c'est homme :p)

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pfiou ça fait 1semaine que je scrute google, que je tente des trucs..
    C'était dans la FAQ C++ 8)

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Petite remarque: je déconseille fortement et même dans les entêtes. Ca les force dans tous les fichiers qui font l'inclusion et ça peut leur donner des conflits qu'ils peuvent difficilement résoudre.
    On peut mettre un using namespace/using std:: dans une fonction inline ?
    (à supposer que le using dans une fonction ne soit pas une extension non-standard)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    On peut mettre un using namespace/using std:: dans une fonction inline?
    Ca ne me gene pas. Vu la taille de mes fonctions inline, je ne vois pas l'interet. Je vois un interet un peu plus grand dans la definition des fonctions templates ou avoir des noms non qualifies est parfois tres interessant.

    (à supposer que le using dans une fonction ne soit pas une extension non-standard)
    Il ne me le semble pas.

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

Discussions similaires

  1. Template - vector - iterator
    Par jmeuf dans le forum Langage
    Réponses: 6
    Dernier message: 30/03/2007, 13h42
  2. [Joomla!] erreur du template joomla 1.5
    Par phpieur dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 24/02/2007, 11h15
  3. Template et iterator
    Par bleast8 dans le forum Langage
    Réponses: 12
    Dernier message: 19/11/2006, 19h59
  4. Template et iterator.
    Par tibtib17 dans le forum Langage
    Réponses: 5
    Dernier message: 29/07/2005, 14h06
  5. Erreur de template
    Par Clad3 dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2005, 15h22

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