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 :

Appel d'une fonction template de façon explicite


Sujet :

Langage C++

  1. #1
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut Appel d'une fonction template de façon explicite
    Bonjour,


    J'ai une classe classique qui doit contenir une fonction static avec un template.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template < class T > static BOOL GetPassagesByEcranPub ( std::vector < FichePassageGeneric > vPassages, long lIdEcranPub );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template < class T >
    BOOL dal::GetPassagesByEcranPub ( std::vector < FichePassageGeneric > vPassages, long lIdEcranPub )
    {
      // C'est dans cette fonction que le template va intervenir
      vector<T> vTmp;
    }
    Ca compile. Pas de soucis.

    Par contre je n'arrive pas appeller cette fonction correctement, j'ai essayé de le faire de façon explicite mais ça ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetPassagesByEcranPub<TDbFichePassageVideo> ( vPassages, lEcranPub );
    J'aimerai bien un conseil.

    Merci d'avance

  2. #2
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Oups j'ai oublié de vous donner le message d'erreur que j'ai lors de la compile
    error C2275: 'TDbFichePassageVideo' : illegal use of this type as an expression

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    il manque la référence à la classe ou est définit la fonction .
    si on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class x
    {
    static void fct();
    };
    //on aura a l'appel : 
    x::fct();

  4. #4
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Effectivement dans le principe il manque cette référence mais la fonction qui appelait la fonction "GetPassagesByEcranPub" était déjà une static de la classe "dal"

    J'ai tout de même essayer en mettant ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dal::GetPassagesByEcranPub<TDbFichePassageVideo> ( vPassages, lEcranPub, pConnect );
    et j'ai toujours la même erreur.

  5. #5
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Pour palier à ce problème, j'ai mis un paramètre bidon qui me permet de transmettre le type du template

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template < class T > static BOOL GetPassagesByEcranPub ( std::vector < FichePassageGeneric > vPassages, long lIdEcranPub, otl_connect * const pConnect, T * pUnused );
    et voici l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dal::GetPassagesByEcranPub ( vPassages, lEcranPub, pConnect, &oPassageVideo )
    Mais je pensais qu'il était possible de mettre explicitement le type du template.

  6. #6
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Existe-t'il une méthode d'utiliser les templates de cette manière mais sans passer un paramètre bidon qui ne sert à rien ?

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu es sûr que TDbFichePassageVideo est bien définit au moment de l'appel ?
    tu peux aussi definir la fonction template en dehors de la classe :
    extrait de mon tuto sur boost serialize
    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
    template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
    class BoostCMap : public CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>
    {
    public:
    
        BoostCMap(int nBlockSize = 10);   
        BoostCMap(const BoostCMap &x);
    //.....
        template<class Archive>
        void load(Archive & ar, const unsigned int version)
        {
    //.....
           BoostSerializeDataName<KEY>(GetDataName(),key),val);
           //.....
        }    
    };
    template<class TYPE>
    CStringA BoostSerializeDataName(CStringA DefaultName, TYPE Element)
    {
        return DefaultName;
    }

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    A adapter à tes classes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A::template ma_fonction<T>();

  9. #9
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Je suis désolé mais je n'ai compris ce que vous avez écrire tous les deux.

    Farscape, je n'ai pas vu ce que je pouvais tirer de cet extrait de code.

    Archi3D, je ne comprends pas le code. Je ne sais même pas si c'est une définition de la fonction ou un appel de fonction.

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    j'ai simplifié le code pour mettre en évidence la portion utilisée.
    au lieu d'avoir une fonction template static tu as une fonction template globale.

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par vanitom Voir le message
    Archi3D, je ne comprends pas le code. Je ne sais même pas si c'est une définition de la fonction ou un appel de fonction.
    Désolé, c'est l'appel d'une fonction template de A :
    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
     
    class A
    {
    public:
       template<class T> static void ma_fonction(void){}
     
       template<class T> static void ma_fonction2(void)
       {
          T::template ma_fonction<int>();
       }
    };
    int main()
    {
       A::ma_fonction<int>();
       A::ma_fonction2<A>();
       return getchar();
    }

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par vanitom Voir le message
    Oups j'ai oublié de vous donner le message d'erreur que j'ai lors de la compile
    Quand le sage montre la lune, l'imbécile regarde le doigt
    Peux-tu nous montrer la ligne de ce code d'erreur ? TDbFichePassageVideo est-il défini au moment où tu fait l'appel?

Discussions similaires

  1. [AJAX] Appeler une fonction Ajax de façon récursive ?
    Par tintin72 dans le forum jQuery
    Réponses: 6
    Dernier message: 18/09/2013, 10h48
  2. [1.x] appelle d'une fonction dans le template
    Par scarabe088 dans le forum Symfony
    Réponses: 1
    Dernier message: 13/09/2011, 21h56
  3. Appel d'une fonction/TThread de façon paramétrique
    Par noahsaga dans le forum C++Builder
    Réponses: 17
    Dernier message: 15/04/2011, 17h15
  4. Appel d'une fonction de façon paramétrique
    Par noahsaga dans le forum C++
    Réponses: 1
    Dernier message: 01/04/2011, 07h33

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