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 :

Template de fonction


Sujet :

Langage C++

  1. #1
    Membre éclairé 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
    Par défaut Template de fonction
    Bonjour,

    J'ai un petit soucis qui m'embête pas mal.

    J'ai une classe et à l'intérieur une fonction maison qui utilise un template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class TDataAccessLayer 
    {
    [...]
    template < class TDB_NAME >
    bool getEntity(vector<TDB_NAME> &vecResult);
    [...]
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template < class TDB_NAME >
    bool TDataAccessLayer::getEntity(vector<TDB_NAME> &vecResult)
    {
    [...]
    	select.setEntity(TDB_NAME::getEntityName());
    [...]
    }
    Ce code compile correctement mais quand je tente de l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataAccessLayer.getEntity<TDbFormat> ( &m_vFormats );
    J'ai l'erreur suivant
    error C2275: 'TDbFormat' : illegal use of this type as an expression
    Et maintenant je ne sais pas quoi faire. Quelqu'un aurait une idée ?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Vire le & de l'appel ainsi que le forcage du type ? Car ton compilo est suffisament grand pour le déduire tout seul.

    Pour preuve, ce code compile sans problème:
    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
     
    #include <iostream>
    #include <vector>
     
    class A
    {
    public:
        template <class T> void foo(std::vector<T>&){}
     
    };
     
    int main(int argc, char const *argv[])
    {
        std::vector<int> v1;
        std::vector<float> v2;
        A a;
        a.foo(v1);
        a.foo(v2);
        return 0;
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre éclairé 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
    Par défaut
    Effectivement je me suis trompé j'ai mis le "&".

    Malheureusement j'ai toujours le même problème.

  4. #4
    Membre éclairé 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
    Par défaut
    Effectivement c'est mieux je n'ai plus l'erreur précédente

    mais j'en ai une autre au link.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unresolved external symbol "public: bool __thiscall TDataAccessLayer::getEntityEx(class std::vector<class TDbFormat,class std::allocator<class TDbFormat> > &)"
    Comme s'il ne trouvait pas ma fonction template. C'est intriguant ça.

  5. #5
    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
    Par défaut
    Il faut définir ton code dans ton .h

  6. #6
    Membre éclairé 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
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Donc, il existe un static TDbFormat::getEntityName()?
    Effectivement car toutes les classes qui seront passées en paramètres dérivent toutes de la même classe de base.

  7. #7
    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
    Par défaut
    J'ai changé le post car j'ai vu qu'il arrivait à contre temps. Je pense que ton problème actuel est d'implémenter le code dans le .h car pour instancier le template.

  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
    Par défaut
    En plus clair, car je me rend compte que ma réponse précédente est un peu obscure:
    Soit tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class TDataAccessLayer 
    {
    [...]
    template < class TDB_NAME >
    bool getEntity(vector<TDB_NAME> &vecResult)
    {
         blablabla
    }
    [...]
    };
    Soit tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class TDataAccessLayer 
    {
    [...]
    template < class TDB_NAME >
    bool getEntity(vector<TDB_NAME> &vecResult);
    [...]
    };
    template bool TDataAccessLayer::getEntity<TDbFormat>(TDbFormat);

  9. #9
    Membre éclairé 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
    Par défaut
    Merci c'était bien ça. C'est vrai que d'habitude je fait des class templates et donc quand j'ai fait les function templates je me suis foutu dedans.

    Merci à vous 2 pour votre aide

  10. #10
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    j'arrive en retard mais la réponse pour les erreurs de links était dans la FAQ.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

Discussions similaires

  1. Classe Template et fonction virtuelle cachée
    Par benbarate dans le forum C++
    Réponses: 5
    Dernier message: 14/05/2010, 09h09
  2. Réponses: 54
    Dernier message: 18/04/2010, 12h51
  3. Réponses: 3
    Dernier message: 09/04/2009, 11h30
  4. Utilisation de template de fonctions
    Par mister3957 dans le forum Langage
    Réponses: 4
    Dernier message: 02/07/2008, 19h07
  5. Réponses: 2
    Dernier message: 27/01/2008, 21h22

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