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 :

Probleme Template


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut Probleme Template
    Bonjour à tous.

    J'ai un problème avec les templates, et apres 2 heures de recherche je ne comprends absolument pas comment le résoudre.
    Voici ce que je fais :

    J'ai une classe dans laquelle je déclare une fonction membre template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<class T>
    T Add(T, T);
    Puis je définis ma méthode, toujours dans le .h, apres la déclaration de ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class T>
    T
    Ma_Classe::Add(T x, T y)
    {
        return x + y ;
    }
    Tout ceci compile très bien. Mais dès lors que je veux utiliser cette méthode en la spécifiant, j'ai une erreur de compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    unsigned long a = 4 ;
    unsigned long b = 5 ;
    unsigned long c = Add<unsigned long>( a, b );
    Et donc le compilateur (je suis sous Visual C++ 6) me répond :

    Error 2062 : type unsigned long unexpected
    Alors que faire ? Je ne comprends vraiment pas mon erreur.
    Merci pour votre aide.

    Alexandre

  2. #2
    Membre éprouvé Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Par défaut Re: Probleme Template
    Citation Envoyé par Muetdhiver
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned long c = Add<unsigned long>( a, b );
    Voila GCC ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned long c = Add( a, b );

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Bah non !
    Si je ne fais pas de spécialisation (<unsigned long>) alors le compilo de vc++ gueule aussi, il dit impossible de spécifier le type de la fonction etc....

    Donc voila, evidemment la détermination automatique des parametres semble la premiere reaction a avoir mais ca marche pas...

    Merci pr ton aide, a plus.

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Dans ton cas, tu ne devrais pas avoir à spécifier le type de données, il le déduit tout seul.

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Tu pourrais donner un petit programme illustrant ton problème? Je suis pas sûr de le comprendre.

    J'ai eu un problème qui ressemble à ce que tu mentionnes.
    GCC (3.3) ne compilait pas ceci, par contre le compilateur Intel si.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<class T>
    struct A
    {
      template<class U> void f() {};
    };
     
    A<float> a;
    a.f<int>();
    Il semblerait que GCC refuse les paramètres templates explicites pour une fonction membre.

    Et puis VC6, c'est super vieux. Je l'utilisais y'a 6-7 ans et il ne comprenait même pas les spécialisations de templates ni les fonctions membres templates. A y réfléchir je crois que ton problème vient de lui.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Merci !

    Effectivement Vc++ 6 est bien vieux mais ds le milieu professionnel on ne fait pas toujours ce qu'on veux quand on travaille pour un client...

    Charlemagne je pense effectivement que tu as raison, c'est le compilo qui bloque, et c'est bien dommage....

    Ce que j'ai essayé c'est de déclarer directement dans ma classe la fonction membre template et de l'utiliser sans la typer explicitement. Il semble que cela fonctionne, mais c'est pas très beau :

    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
     
     
    class MaClasse 
    {
     
    public : 
       // ....
     
    private :
       template <class T>
       MaFonction(T t)
       {
          // .... 
       }
    };
    et ainsi quand j'utilise cette fonction sans typage explicite, ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MaClasse::Fonction2( int i )
    {
       MaFonction(i) ;
    }
    Alors qu'avant quand je séparais la déclaration de la définition de la fonction j'étais obligé de mettre un typage explicite :

    MaFonction<int>(i),

    aussi étrange que cela puisse paraitre, et en plus ca ne compilais pas !

    Pour autant je ne considère pas ce problème comme résolu car je suis obligé de faire mes fonctions templates dans la déclaration de ma classe, et je trouve ca tres moche !

    Merci, a plus.

  7. #7
    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
    Pour autant je ne considère pas ce problème comme résolu car je suis obligé de faire mes fonctions templates dans la déclaration de ma classe, et je trouve ca tres moche !
    Il me semble me souvenir que c'est pourtant le seul moyen de compiler ce genre de chose, donc tu n'as pas trop le choix.

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Effectivement Vc++ 6 est bien vieux mais ds le milieu professionnel on ne fait pas toujours ce qu'on veux quand on travaille pour un client...
    Le choix des outils et pourtant essentiel.
    Mais j'admets qu'en entreprise on ne fait pas ce qu'on veut.

    A l'arrivée du visual 7, Microsoft avait sorti une rustine pour VC6 qui mettait le compilo au niveau du VC7.
    VC7 est loin d'être parfait également (il acceptait les spécialisations mais pas les spécialisations partielles...), mais ça vaudrait surement le coup pour toi d'essayer .
    Qui sait, il y a peut-être une rustine plus récente.
    A l'époque je crois que je l'avais téléchargée sur www.telecharger.com.

    Sinon, VC 2005 Express est téléchargeable gratuitement. J'avais essayé la version beta, et le compilo semblait enfin à niveau.

    PS:
    Je confirme: Visual Studio 6.0 Service Pack 4

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Citation Envoyé par Loulou24
    Pour autant je ne considère pas ce problème comme résolu car je suis obligé de faire mes fonctions templates dans la déclaration de ma classe, et je trouve ca tres moche !
    Il me semble me souvenir que c'est pourtant le seul moyen de compiler ce genre de chose, donc tu n'as pas trop le choix.
    Euh, oui ! En fait je parlais de décorreler la déclaration de la fonction et l'écriture de son prototype, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class MaClasse
    {
        private :
        template <typename T>
        T MaFonction ( T );
    };
     
    template <typename T>
    MaClasse::MaFonction( T t)
    {
        // blabla...
    }
    Je croyais que c t possible, plutot que de tout écrire directement dans la déclaration de la classe, le truc tout moche.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    C'est possible, mais pas avec VC6.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    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
    Euh, oui ! En fait je parlais de décorreler la déclaration de la fonction et l'écriture de son prototype, du genre :
    Oui oui, c'est bien ce que je voulais dire, mixer définition et déclaration est le seul moyen de compiler une fonction membre template avec VC6.

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Ah oki merci ! Sacré VC6 ....
    On fera avec alors.

Discussions similaires

  1. probleme template a plusieurs parametres
    Par typedef dans le forum Langage
    Réponses: 4
    Dernier message: 01/05/2010, 08h13
  2. [probleme] template singleton et .lib static
    Par typedef dans le forum Bibliothèques
    Réponses: 12
    Dernier message: 09/02/2010, 16h21
  3. probleme template hash_map
    Par rolphbrua dans le forum Langage
    Réponses: 1
    Dernier message: 08/08/2006, 23h18
  4. probleme template qcm en loadmovie
    Par serna dans le forum Flash
    Réponses: 3
    Dernier message: 05/06/2006, 22h59
  5. probleme template me renvoi qq chose en trop
    Par Triangle dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 29/07/2005, 15h01

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