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 et __declspec(dllexport) : LNK2019


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut template et __declspec(dllexport) : LNK2019
    Bonjour à tous,

    J'ai un projet librairie définissant une classe du style:

    MyClass.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template <typename T>
    class __declspec(dllexport) MyClass
    {
    public:
        MyClass(const T& value);
    private
        T m_value;
    }
    MyClass.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template <typename T>
    MyClass<T>::MyClass(const T& value)
    : m_value(value)
    {
     
    }

    Dans un autre projet, le .lib est bien présent dans les input. Je test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyClass<int> myObject(4);
    Et j'ai des erreurs :
    error LNK2019: symbole externe non résolu "public: __thiscall MyClass<int>::MyClass<int>(int const &)" (??0?$MyClass@H@@QAE@ABH@Z) référencé dans la fonction _WinMain@16

    Que se passe-t-il ?

    Merci beaucoup

    A bientôt

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Une classe template ne sera effectivement compilé par le compilateur que s'il en a besoin. Ainsi si dans te dll tu n'a pas de MyClass<int>, et bien effectivement, le compilateur ne va pas créer cet objet.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Ha ok d'acc,


    Donc ne sachant pas à l'avance quel type sera utilisé avec ma classe, je suis obligé d'implémenter les méthodes dans le .h (ou un .inl) afin qu'elle soit compilé dans les projets utilisateurs.
    Mais dans ce cas, elles seront inline.


    Y a-t-il une solution pour les faire compiler par l'utilisateur sans pour autant les rendre inline?


    Merci beaucoup


    A bientôt

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Y a-t-il une solution pour les faire compiler par l'utilisateur sans pour autant les rendre inline?
    pourquoi ??

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Bah je sais pas, y paraît qu'il faut plutôt limiter les "inline", et dans mon cas, ce sont des fonctions qui sont utilisées pas ci couramment que ça...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Je crois qu'il n'y a pas de moyen universellement supporté par les compilateurs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Donc ne sachant pas à l'avance quel type sera utilisé avec ma classe, je suis obligé d'implémenter les méthodes dans le .h (ou un .inl) afin qu'elle soit compilé dans les projets utilisateurs.
    Mais dans ce cas, elles seront inline.
    Pourquoi?

    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template <typename T>
    struct s
    {
       void m();
    };
     
    template <typename T>
    void s<T>::m()
    {
    }
    s::m() n'est pas inline.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Oui c'est bon, c'est moi qui n'a pas réfléchit (encore).


    Merci beaucoup pour vos réponses


    A bientôt

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Il peut aussi arriver que tu connaisses à l'avance quelles classes sont possibles pour instancier ton template. Il peut alors devenir interessant de placer un cpp dans ta DLL qui va instancier ton template pour les types que tu veux.
    Comme ça plus besoin de fournir toute l'implémentation du template et l'utilisateur ne perd plus de temps à le compiler lui même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "TestTemplate.cpp"
     
    // Instanciations explicites pour les int, float et double
    template TestTemplate<int>;
    template TestTemplate<float>;
    template TestTemplate<double>;

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Il peut aussi arriver que tu connaisses à l'avance quelles classes sont possibles pour instancier ton template. Il peut alors devenir interessant de placer un cpp dans ta DLL qui va instancier ton template pour les types que tu veux.
    Comme ça plus besoin de fournir toute l'implémentation du template et l'utilisateur ne perd plus de temps à le compiler lui même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "TestTemplate.cpp"
     
    // Instanciations explicites pour les int, float et double
    template TestTemplate<int>;
    template TestTemplate<float>;
    template TestTemplate<double>;
    Es tu sur que comme cela, toute les fonction vont être compiler pour chaque type??
    J'avais compris qu'avec les template, seule les fonctions appelées dans le code sont compilé

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Es tu sur que comme cela, toute les fonction vont être compiler pour chaque type?
    Oui.

    J'avais compris qu'avec les template, seule les fonctions appelées dans le code sont compilé
    Il y a quelques exceptions. (Une requete explicite comme ici, les membres virtuels en sont une autre).

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Ok merci.
    c'est bon à savoir

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    en faite ca compile la class si on fait ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template TestTemplate<int>;
    mais un typedef ne le fera pas, non??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef TestTemplate<int> blabla;

  14. #14
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Non le typedef n'est pas supposé instancier quoi que ce soit.
    Tu peux faire autant de typedef que tu veux sur une même classe, mais tu ne pourras faire qu'une unique instanciation explicite via le mot clef template.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    merci

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

Discussions similaires

  1. __declspec(dllexport) et membres
    Par mister3957 dans le forum C++
    Réponses: 6
    Dernier message: 25/03/2009, 14h26
  2. Réponses: 11
    Dernier message: 06/11/2008, 09h49
  3. static et __declspec(dllexport)
    Par squale69 dans le forum Visual C++
    Réponses: 2
    Dernier message: 16/05/2008, 00h01
  4. template et __declspec(dllexport)
    Par mister3957 dans le forum Langage
    Réponses: 15
    Dernier message: 14/03/2008, 08h45
  5. __declspec(dllexport) dans mon fichier header mais...?
    Par Jasmine dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 03/03/2004, 18h00

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