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

C++ Discussion :

explicit instanciation et specialisation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut explicit instanciation et specialisation
    Bonjour,

    J'ai une classe templatée MyClass<T> dans un projet dont le compilé est une dll destinée à être liée en statique par un exe. Cette classe utilise des librairies externes. Pour éviter que l'utilisateur de cette dll ait à lier avec ces librairies externes, je fais une instanciation explicite pour les valeurs de T les plus courantes. Donc à la fin du header où se trouve la déclaration de cette classe et dans son namespace, j'ai rajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template class MyClass<int>;
    template class MyClass<char>;
     ... etc ...
    Ca fonctionne : l'exe peut travailler directement avec MyClass<int> sans avoir à lier avec les fameuses librairies externes. Et dès que je supprime l'instanciation explicite, le compilateur me réclame les librairie à l'édition des liens de l'exe. Donc c'est OK.

    Par contre quand je veux spécialiser une méthode de MyClass<T> pour T = int. Ca ne marche pas. La dll compile sans soucis. Mais malgré l'instanciation explicite de MyClass<int>, le compilateur ne trouve pas les librairies externes lors de l'édition des liens de l'exe.

    C'est comme si la spécialisation de cette fonction ne faisait pas partie de l'instanciation explicite. Comme si le compilateur n'avait pas intégrer cette spécialisation lors du build de la dll et donc que ce soit le build de l'exe qui ait à s'en charger.

    Il y a un moyen de résoudre ce problème ?

    Flo.

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Bonjour,

    De ce qu'en dit ma maigre expérience, il n'y a pas de problème conceptuel dans ce que tu cherches à faire.

    Les quelques fois où j'ai eu à faire des dll présentant des classes, j'ai toujours eu des problèmes, je préfère éviter cette pratique.

    Je pense qu'il va falloir que tu nous en donne plus :
    - est-ce que ton code final fonctionne (et pas seulement compile) si tu utilise la méthode (au lieu de la surcharger) ?
    - peux-tu nous montrer comment tu surcharge la méthode ?
    - je suppose que d'une façon ou d'une autre, il te faut exporter la méthode surchargée ?

  3. #3
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    OK ...

    Dans la DLL, j'ai le fichier MyClass.h

    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
     
    namespace ASpace
    {
    template<typename T> class MyClass
    {
    public:
        void AFunction()
        {
            // .... utlisation d'une librairie externe liée en statique (OpenCV) ...
        }
    };
    };
     
    // explicit instanciation
    template class DLL_DECORATION ASpace::MyClass<int>;
    Dans ce cas là tout fonctionne bien. Lors de l'édition des lien de l'exe qui se lie en statique à la dll, Visual Studio ne me réclame pas la librarie externe. Cela signifie que la dll embarque bien un objet de type MyClass<int>.

    Si par contre je modifie mon header de la façon suivante :

    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
     
    namespace ASpace
    {
    template<typename T> class MyClass
    {
    public:
        void AFunction()
        {
            // ... pas d'utilisation de la librarie externe
        }
    };
         template<> void MyClass<int>::AFunction()
         {
            // .... utlisation d'une librairie externe liée en statique (OpenCV) ...
         }
    };
     
    // explicit instanciation
    template class DLL_DECORATION ASpace::MyClass<int>;
    la dll est bien construite mais à l'édition des liens de l'exe qui utilise MyClass<int> j'ai des erreurs : Visual Studio ne trouve pas les références vers les fonctions de la librairie externe. Cela signifie que la dll embarque peut-être un objet de type MyClass<int> mais pas la spécialisation de la fonction void MyClass<T>::AFunction() pour T = int.

    Voilà en espérant que c'est un peu plus clair.

    Flo.

  4. #4
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Citation Envoyé par Flo. Voir le message
    Cela signifie que la dll embarque peut-être un objet de type MyClass<int> mais pas la spécialisation de la fonction void MyClass<T>::AFunction() pour T = int.
    Non-seulement elle n'embarque pas la spécialisation, mais elle n'embarque plus non-plus la version d'origine.

    Je pense qu'il te manque quelque chose ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<> QUELQUECHOSEPOURDIREQUETUEXPORTECECI void MyClass<int>::AFunction()
         {
            // .... utlisation d'une librairie externe liée en statique (OpenCV) ...
         }
    Mais je ne sais pas quoi.

    [EDIT] OpenCV est vraiment très impressionnant, tu travailles sur quoi ?[/EDIT]

  5. #5
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    Ah ben c'est cool ça marche.

    Il faut donc bien rajouter à la spécialisation de la fonction une décoration style __declspec(dllexport) ou __declspec(dllimport). Ce que je faisais déjà via mon DLL_DECORATION pour l'instanciation explicite.

    Quant à OpenCV, je l'utilise pour faire des opérations courantes de traitement d'images (morphologie, manipulation d'images, etc.).

    T'as un forum sur OpenCV si t'es fan

    http://www.developpez.net/forums/f73...heques/opencv/

    Merci encore Feriaman

    Flo.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 02/11/2011, 11h49
  2. [template] Instanciation explicite de template
    Par Médinoc dans le forum Langage
    Réponses: 19
    Dernier message: 17/11/2008, 14h58
  3. Réponses: 2
    Dernier message: 02/10/2008, 16h37
  4. [VB6]Déclaration d'un Constructeur Spécialisé
    Par TagadaTsoin dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 26/05/2004, 14h09
  5. - Insertion : valeur explicite
    Par Leoxp dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/05/2003, 17h21

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