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 :

un parametre de template qui est refuser


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut un parametre de template qui est refuser
    Bonjour,

    J'ai une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<int val>
    void P() 
    {
     //...
    }
    et je l'utilise ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
     //...
     int i=2;
     P<i>();
     //...
    }
    Il m'affiche le message d'erreur suivant: 'i' cannot appear in a constant-expression

    Comment regler l'erreur?

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Points : 111
    Points
    111
    Par défaut
    Le but de ton code n'est pas très clair.
    Tu veux faire une fonction template P sans argument ?
    Es-tu sur d'avoir besoin de template dans ce cas ?

    je te propose deux solutions :
    1) pas de template, et P prend un argument:

    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
     
    void P(int val) 
    {
     //...
    }
     
    //..
     
    int main() 
    {
      //...
      int i=2;
      P(i);
      //... 
    }
    ou un seul paramètre de type variable dans P :

    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
    template<typename T>
    void P(T val) 
    {
     //...
    }
     
    //..
     
    int main() 
    {
      //...
      int i=2;
      P<int>(i);
      //... 
    }
    Vous aussi, passez pour un dieu du bon français grâce à Firefox et sa correction orthographique

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par lichman
    Il m'affiche le message d'erreur suivant: 'i' cannot appear in a constant-expression
    Un paramètre non-type de template doit être une constante. Pour rêgler ton problème, il te faut :

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    en fait, j'ai une fonction recursif et j'aimerai ne pas metre de parametre qui ne changera de tout facon pas...
    J'ai aussi un autre probleme qui est tres similaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template<int val, void (*fct)(int)>
    void P() 
    {
     //...
    }
     
    int main()
    {
      //...
      void (*f)(int) = fct;
      P<i, f>();
      //...
    }
    Il refuse egalement.
    Il dit: `f' is not a valid template argument.

  5. #5
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce qu'il faut bien assimiler, c'est que les paramètres templates doivent être connus à la compilation. Tu ne peux donc pas passer des variables.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Laurent Gomila
    Ce qu'il faut bien assimiler, c'est que les paramètres templates doivent être connus à la compilation. Tu ne peux donc pas passer des variables.
    Ok, merci.

    Mais consernant le probleme avec la fonction, vois-tu une erreur?

    A+

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Tu n'as pas le droit de mettre des variables entre <>, tu ne peux mettre que des types, c'est-à-dire "int", "char".... Les <> ne servent pas à passer des paramètres, ce que tu essayes de faire à chaque fois : i et f sont des variables et non pas des types.
    Fumidu t'a donné un très bon exemple d'utilisation des templates.

    Je ne pense pas que dans ton exemple tu aies besoin des templates.
    Pour faire un fonction récursive, tu es quasi-obligé de mettre des paramètres. L'autre solution est d'utiliser des variables globales.

  8. #8
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu n'as pas le droit de mettre des variables entre <>, tu ne peux mettre que des types, c'est-à-dire "int", "char".... Les <> ne servent pas à passer des paramètres, ce que tu essayes de faire à chaque fois : i et f sont des variables et non pas des types.
    Fumidu t'a donné un très bon exemple d'utilisation des templates.
    On peut très bien passer des constantes. Donc notamment des entiers, et des pointeurs.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Laurent Gomila
    On peut très bien passer des constantes. Donc notamment des entiers, et des pointeurs.
    Tu pourrais me dire où est mon erreur avec le passage de fonction comme parametre du template?

  10. #10
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par lichman
    Tu pourrais me dire où est mon erreur avec le passage de fonction comme parametre du template?
    Tu lui passes une variable. Passe lui directement l'adresse de ta fonction.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    En fesant P<i, &f>();
    Il m'ecrit:
    missing `>' to terminate the template argument list
    expected `;' before "f"


    Et en fesant ceci: P<i, f>();
    Il m'ecrit:
    `fct' is not a valid template argument
    it must be the address of a function with external linkage


    Je supose qu'on ne passe pas l'adresse d'une fonction avec &
    Donc, comment avoir l'adresse de la fonction? Ou alors, mon erreur est ailleur?

    Merci de vos reponces

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    A nouveau f est une variable, passe-lui directement le pointeur vers la fonction.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. [VB.NET] Comment supprimer un fichier qui est utilisé ?
    Par Toon94 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/06/2010, 12h59
  2. [Joomla!] Qui est le moteur de template de Joomla ?
    Par wassimbik dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 12/02/2009, 17h20
  3. Spécialisation template qui n'est jamais appelée
    Par coyotte507 dans le forum Langage
    Réponses: 4
    Dernier message: 02/05/2008, 12h39
  4. Réponses: 2
    Dernier message: 16/10/2003, 17h17
  5. Une table qui existe mais qui est inconnu! ?
    Par Nino dans le forum InterBase
    Réponses: 6
    Dernier message: 13/06/2003, 11h47

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