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 :

Syntaxe pour les template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut Syntaxe pour les template
    Bonjour,

    Je suis tombé récemment sur le problème suivant, je me suis dit que j’allais en faire profiter un peu tout le monde. Je n’avais jamais rencontré ce besoin auparavant. Je suis preneur aussi d’une explication sur le pourquoi de la correction, car celle-là, je ne l’ai pas comprise.

    Bref, le code suivant ne compile pas : que faut-il pour le corriger (solution demain soir si – mais j’en doute – personne n’a trouvé).

    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
     
    int f1()
    {
        return 2;
    }
     
    template<class Func, class T>
    void f(Func f, T& a)
    {
        a.func<decltype(f())>();
    }
     
    struct A
    {
        template<typename T> T func();
    };
     
    template<typename T> T A::func()
    {
        return T();
    }
     
    int main()
    {
        A a;
        f(f1, a);
        return 0;
    }
    Bien évidemment, ce code ne fait rien : il sert seulement à reproduire l’erreur que j’avais (et la correction a y apporter). Le but est bien d’appeler la fonction A.func, avec comme paramètre template le type de retour de la fonction f.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    On peut avoir le message d'erreur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<typename T> 
    struct A
    {
        T func();
    };
     
     
    A<machin> a;
    ?

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Avec gcc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    test2.cpp: In function ‘void f(Func, T&)’:
    test2.cpp:9:9: error: expected primary-expression before ‘decltype’
    test2.cpp:9:9: error: expected ‘;’ before ‘decltype
    Note : il est interdit de changer A. func doit être une fonction membre template de A, qui elle n’est pas template.

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    J'ai souvent eu cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<class Func, class T>
    void f(Func f, T& a)
    {
        a.template func<decltype(f())>();
    }
    Je pense que c'est pour que le parser du compilateur puisse lire cette fonction en sachant que les chevrons de <decltype(f())> correspondent à une instanciation d'un template, plutôt qu'à des opérateurs de comparaison. En effet, lors de la lecture du fichier, le compilateur ne sais pas ce qu'est a.func, en particulier il ne sait pas que c'est une fonction template, puisqu'il ne connaît pas le type T. Dans le fond c'est un problème équivalent au typename T::type qu'on doit taper régulièrement quand on fait de la métaprog.

    Edit : un exemple pour appuyer mes dires. Ton code initial en réalité ne devrait pas poser d’ambiguïté, puisqu'aucun type T ne permettrait de compiler ta fonction template avec les chevrons interprétés comme opérateurs de comparaison (en tout cas je n'en vois aucun). En revanche si tu écris :
    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
    template<int N, class T>
    void f(int i, T& a)
    {
        a.func<N>(i);
    }
     
    struct A
    {
        template<int N> int func(int i) {
            return N + i;
        }
    };
     
    struct B
    {
        int func = 5;
    };
    ... alors tu peux appeler ta fonction f sur le type B sans erreur (il faut un peu d'imagination pour voir comment le compilateur arrive à interpréter ça ). Il faudra ajouter le mot clé template pour que ça compile avec A (et non plus avec B).

  5. #5
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    C’est bien ça.

    Et effectivement, ton explication me parait pertinente. Je ne l’avais pas envisagé comme ça, mais il y a bien ambiguïté sur l’appel.

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Enfin, une dernière chose.

    Le message d’erreur donné par g++ est incompréhensible. À titre de comparaison, je vous donne celui donné par clang-3.2 (grâce auquel j’ai résolu mon problème).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    test2.cpp:9:7: error: use 'template' keyword to treat 'func' as a dependent template name
        a.func<decltype(f())>();
          ^
          template

Discussions similaires

  1. Évolution : syntaxe [] pour les tableaux
    Par Yogui dans le forum Langage
    Réponses: 29
    Dernier message: 19/03/2008, 12h10
  2. Syntaxe pour les conditions
    Par Gabout dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/05/2007, 12h27
  3. La meilleure syntaxe pour les entrées/sorties
    Par Lunixinclar dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/03/2007, 13h55
  4. Réponses: 2
    Dernier message: 17/03/2007, 00h15
  5. Syntaxe pour les heures
    Par Soph70 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 26/09/2006, 15h48

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